[noop-changes] [noop] 4 new revisions pushed by aeagle22206 on 2010-04-23 14:16 GMT

1 view
Skip to first unread message

no...@googlecode.com

unread,
Apr 23, 2010, 10:17:37 AM4/23/10
to noop-c...@googlegroups.com
4 new revisions:

Revision: fcae4a33b5
Author: Alex Eagle <alex...@google.com>
Date: Fri Apr 23 03:26:30 2010
Log: Dump code to XML as well, to get a sense of how serialization will
wor...
http://code.google.com/p/noop/source/detail?r=fcae4a33b5

Revision: cf30c296cc
Author: Alex Eagle <alex...@google.com>
Date: Fri Apr 23 04:40:41 2010
Log: Improvements suggested in code review. (Thanks, Bobby!!)
http://code.google.com/p/noop/source/detail?r=cf30c296cc

Revision: 91a7ad9170
Author: Alex Eagle <alex...@google.com>
Date: Fri Apr 23 04:53:28 2010
Log: Fix recursive allocation of EmptyDocumentation's in
EmptyDocumentation...
http://code.google.com/p/noop/source/detail?r=91a7ad9170

Revision: 1b23ab128d
Author: Alex Eagle <alex...@google.com>
Date: Fri Apr 23 06:41:28 2010
Log: Prepare for serializing the model, by assigning each language
element ...
http://code.google.com/p/noop/source/detail?r=1b23ab128d

==============================================================================
Revision: fcae4a33b5
Author: Alex Eagle <alex...@google.com>
Date: Fri Apr 23 03:26:30 2010
Log: Dump code to XML as well, to get a sense of how serialization will
work, and thanks to encouragement from stevey.

It feels backwards to assemble code out of deltas, especially when I
started working on deserializing from XML. It also means that the schema of
the code is only expressed in the "adoptChild" methods, which did a bunch
of nasty casting to take the untyped relationships in the graph and
reassemble a valid tree. Bobby pointed this out in a code review yesterday.

Instead, just assemble the tree the traditional way, by adding children to
their parents, using typed methods. Will work on AOP instrumentation of the
model classes, as in Hibernate, so that when they're registered as
persistant objects, we can record the stream of deltas as the mutator
methods are called.
http://code.google.com/p/noop/source/detail?r=fcae4a33b5

Modified:
/core/pom.xml
/core/src/main/java/noop/graph/Controller.java
/core/src/main/java/noop/graph/Workspace.java
/core/src/main/java/noop/model/Binding.java
/core/src/main/java/noop/model/Block.java
/core/src/main/java/noop/model/Clazz.java
/core/src/main/java/noop/model/Comment.java
/core/src/main/java/noop/model/Function.java
/core/src/main/java/noop/model/IdentifierDeclaration.java
/core/src/main/java/noop/model/LanguageElement.java
/core/src/main/java/noop/model/Library.java
/core/src/main/java/noop/model/Loop.java
/core/src/main/java/noop/model/Method.java
/core/src/main/java/noop/model/Project.java
/core/src/main/java/noop/model/UnitTest.java
/core/src/main/java/noop/stdlib/StandardLibraryBuilder.java
/core/src/test/java/noop/graph/ArithmeticExample.java
/core/src/test/java/noop/graph/ControlFlowExample.java
/core/src/test/java/noop/graph/DumpExamplesMain.java
/core/src/test/java/noop/graph/HelloWorldExample.java
/core/src/test/java/noop/graph/WorkspaceDumper.java

=======================================
--- /core/pom.xml Wed Apr 21 09:23:46 2010
+++ /core/pom.xml Fri Apr 23 03:26:30 2010
@@ -35,5 +35,15 @@
<artifactId>joda-time</artifactId>
<version>1.6</version>
</dependency>
+ <dependency>
+ <groupId>com.thoughtworks.xstream</groupId>
+ <artifactId>xstream</artifactId>
+ <version>1.3.1</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.inject</groupId>
+ <artifactId>guice</artifactId>
+ <version>2.0</version>
+ </dependency>
</dependencies>
</project>
=======================================
--- /core/src/main/java/noop/graph/Controller.java Tue Apr 20 08:34:11 2010
+++ /core/src/main/java/noop/graph/Controller.java Fri Apr 23 03:26:30 2010
@@ -37,10 +37,10 @@
int nextNodeId = workspace.elements.size();
LanguageElement container = operation.container == null ? workspace :
operation.container;

- if (!container.adoptChild(operation.newElement)) {
- throw new IllegalArgumentException("Element " + operation.newElement
- + " not allowed as child of " + container);
- }
+// if (!container.adoptChild(operation.newElement)) {
+// throw new IllegalArgumentException("Element " +
operation.newElement
+// + " not allowed as child of " + container);
+// }
int destId = workspace.elements.indexOf(container);
if (destId < 0) {
throw new IllegalStateException(String.format("Cannot add edge [%s
-> %s] due to non-existant dest %s",
=======================================
--- /core/src/main/java/noop/graph/Workspace.java Mon Apr 19 10:04:58 2010
+++ /core/src/main/java/noop/graph/Workspace.java Fri Apr 23 03:26:30 2010
@@ -36,14 +36,12 @@
private List<Project> projects = Lists.newArrayList();
private List<LanguageElement> orphans = Lists.newArrayList();

- @Override
- public boolean adoptChild(LanguageElement child) {
- if (child instanceof Project) {
- projects.add((Project) child);
- } else {
- orphans.add(child);
- }
- return true;
+ public void addProject(Project project) {
+ projects.add(project);
+ }
+
+ public void addOrphan(LanguageElement orphan) {
+ orphans.add(orphan);
}

@Override
=======================================
--- /core/src/main/java/noop/model/Binding.java Wed Apr 21 09:23:46 2010
+++ /core/src/main/java/noop/model/Binding.java Fri Apr 23 03:26:30 2010
@@ -6,21 +6,6 @@
* @author alex...@google.com (Alex Eagle)
*/
public class Binding extends LanguageElement<Binding> {
- private Clazz type;
- private Expression boundTo;
-
- @Override
- public boolean adoptChild(LanguageElement child) {
- if (child instanceof Clazz) {
- type = (Clazz) child;
- return true;
- }
- if (child instanceof Expression) {
- boundTo = (Expression) child;
- return true;
- }
- return super.adoptChild(child);
- }

@Override
public void accept(ModelVisitor v) {
=======================================
--- /core/src/main/java/noop/model/Block.java Thu Apr 22 02:43:30 2010
+++ /core/src/main/java/noop/model/Block.java Fri Apr 23 03:26:30 2010
@@ -32,13 +32,8 @@
this.name = name;
}

- @Override
- public boolean adoptChild(LanguageElement child) {
- if (child instanceof Expression) {
- statements.add((Expression) child);
- return true;
- }
- return super.adoptChild(child);
+ public void addStatement(Expression statement) {
+ statements.add(statement);
}

@Override
=======================================
--- /core/src/main/java/noop/model/Clazz.java Tue Apr 20 08:34:11 2010
+++ /core/src/main/java/noop/model/Clazz.java Fri Apr 23 03:26:30 2010
@@ -31,15 +31,6 @@
public Clazz(String name) {
this.name = name;
}
-
- @Override
- public boolean adoptChild(LanguageElement child) {
- if (child instanceof Block) {
- blocks.add((Block) child);
- return true;
- }
- return super.adoptChild(child);
- }

@Override
public void accept(ModelVisitor v) {
@@ -51,4 +42,8 @@
}
super.accept(v);
}
-}
+
+ public void addBlock(Block block) {
+ blocks.add(block);
+ }
+}
=======================================
--- /core/src/main/java/noop/model/Comment.java Wed Apr 21 09:23:46 2010
+++ /core/src/main/java/noop/model/Comment.java Fri Apr 23 03:26:30 2010
@@ -21,9 +21,4 @@
public void accept(ModelVisitor v) {
v.visit(this);
}
-
- @Override
- public boolean adoptChild(LanguageElement child) {
- return false;
- }
-}
+}
=======================================
--- /core/src/main/java/noop/model/Function.java Thu Apr 22 02:43:30 2010
+++ /core/src/main/java/noop/model/Function.java Fri Apr 23 03:26:30 2010
@@ -16,13 +16,8 @@
super(name);
}

- @Override
- public boolean adoptChild(LanguageElement child) {
- if (child instanceof Parameter) {
- parameters.add((Parameter) child);
- return true;
- }
- return super.adoptChild(child);
+ public void addParameter(Parameter parameter) {
+ this.parameters.add(parameter);
}

@Override
=======================================
--- /core/src/main/java/noop/model/IdentifierDeclaration.java Tue Apr 20
08:34:11 2010
+++ /core/src/main/java/noop/model/IdentifierDeclaration.java Fri Apr 23
03:26:30 2010
@@ -29,13 +29,8 @@
this.name = name;
}

- @Override
- public boolean adoptChild(LanguageElement child) {
- if (child instanceof Expression) {
- initialValue = (Expression) child;
- return true;
- }
- return false;
+ public void setInitialValue(Expression expression) {
+ this.initialValue = expression;
}

@Override
=======================================
--- /core/src/main/java/noop/model/LanguageElement.java Wed Apr 21 09:23:46
2010
+++ /core/src/main/java/noop/model/LanguageElement.java Fri Apr 23 03:26:30
2010
@@ -54,21 +54,16 @@
this.previousVersion = previousVersion;
}

- public boolean adoptChild(LanguageElement child) {
- if (child instanceof Documentation) {
- this.documentation = (Documentation) child;
- return true;
- }
- if (child instanceof Comment) {
- this.comments.add((Comment) child);
- return true;
- }
- // TODO: not sure that unit tests can be attached literally anywhere
- if (child instanceof UnitTest) {
- UnitTest block = (UnitTest) child;
- unitTests.add(block);
- return true;
- }
- return false;
+ public void setDocumentation(Documentation documentation) {
+ this.documentation = documentation;
+ }
+
+ public void addComment(Comment comment) {
+ this.comments.add(comment);
+ }
+
+ // TODO: not sure that unit tests can be attached literally anywhere
+ public void addUnitTest(UnitTest unitTest) {
+ unitTests.add(unitTest);
}
}
=======================================
--- /core/src/main/java/noop/model/Library.java Tue Apr 20 08:34:11 2010
+++ /core/src/main/java/noop/model/Library.java Fri Apr 23 03:26:30 2010
@@ -33,18 +33,12 @@
this.name = name;
}

- @Override
- public boolean adoptChild(LanguageElement child) {
- if (child instanceof Clazz) {
- classes.add((Clazz) child);
- return true;
- }
- if (child instanceof Function) {
- Function block = (Function) child;
- functions.add(block);
- return true;
- }
- return super.adoptChild(child);
+ public void addClazz(Clazz clazz) {
+ this.classes.add(clazz);
+ }
+
+ public void addFunction(Function function) {
+ this.functions.add(function);
}

@Override
=======================================
--- /core/src/main/java/noop/model/Loop.java Thu Apr 22 02:43:30 2010
+++ /core/src/main/java/noop/model/Loop.java Fri Apr 23 03:26:30 2010
@@ -8,18 +8,13 @@
public class Loop extends Expression<Loop> {
public Expression terminationCondition;
public Block body;
-
- @Override
- public boolean adoptChild(LanguageElement child) {
- if (child instanceof Expression) {
- terminationCondition = (Expression) child;
- return true;
- }
- if (child instanceof Block) {
- body = (Block) child;
- return true;
- }
- return false;
+
+ public void setTerminationCondition(Expression condition) {
+ this.terminationCondition = condition;
+ }
+
+ public void setBody(Block body) {
+ this.body = body;
}

@Override
=======================================
--- /core/src/main/java/noop/model/Method.java Thu Apr 22 02:43:30 2010
+++ /core/src/main/java/noop/model/Method.java Fri Apr 23 03:26:30 2010
@@ -15,13 +15,8 @@
super(name);
}

- @Override
- public boolean adoptChild(LanguageElement child) {
- if (child instanceof Parameter) {
- parameters.add((Parameter) child);
- return true;
- }
- return super.adoptChild(child);
+ public void addParameter(Parameter parameter) {
+ this.parameters.add(parameter);
}

@Override
=======================================
--- /core/src/main/java/noop/model/Project.java Tue Apr 20 08:34:11 2010
+++ /core/src/main/java/noop/model/Project.java Fri Apr 23 03:26:30 2010
@@ -50,15 +50,10 @@
this.copyright = copyright;
}

- @Override
- public boolean adoptChild(LanguageElement child) {
- if (child instanceof Library) {
- libraries.add((Library) child);
- return true;
- }
- return super.adoptChild(child);
- }
-
+ public void addLibrary(Library library) {
+ this.libraries.add(library);
+ }
+
@Override
public int hashCode() {
return new HashCodeBuilder()
=======================================
--- /core/src/main/java/noop/model/UnitTest.java Wed Apr 21 09:10:37 2010
+++ /core/src/main/java/noop/model/UnitTest.java Fri Apr 23 03:26:30 2010
@@ -9,14 +9,6 @@
public UnitTest(String name) {
super(name);
}
-
- @Override
- public boolean adoptChild(LanguageElement child) {
- if (child instanceof Parameter) {
- return false;
- }
- return super.adoptChild(child);
- }

@Override
public void accept(ModelVisitor v) {
=======================================
--- /core/src/main/java/noop/stdlib/StandardLibraryBuilder.java Thu Apr 22
02:43:30 2010
+++ /core/src/main/java/noop/stdlib/StandardLibraryBuilder.java Fri Apr 23
03:26:30 2010
@@ -20,7 +20,7 @@
public Clazz stringClazz;
public Clazz voidClazz;
public Clazz booleanClazz;
- public Block printMethod;
+ public Method printMethod;
public Method integerPlus;
public Method integerEquals;

@@ -31,47 +31,47 @@
result.add(new NewNodeOperation(project));

Library lang = new Library("lang");
- result.add(new NewNodeOperation(lang, project));
+ project.addLibrary(lang);

stringClazz = new Clazz("String");
- result.add(new NewNodeOperation(stringClazz, lang));
+ lang.addClazz(stringClazz);

voidClazz = new Clazz("Void");
- result.add(new NewNodeOperation(voidClazz, lang));
+ lang.addClazz(voidClazz);

Library io = new Library("io");
- result.add(new NewNodeOperation(io, project));
+ project.addLibrary(io);

consoleClazz = new Clazz("Console");
- result.add(new NewNodeOperation(consoleClazz, io));
+ io.addClazz(consoleClazz);

printMethod = new Method("print");
- result.add(new NewNodeOperation(printMethod, consoleClazz));
+ consoleClazz.addBlock(printMethod);
result.add(new NewEdgeOperation(printMethod, TYPEOF, voidClazz));

Parameter printArg = new Parameter("s");
- result.add(new NewNodeOperation(printArg, printMethod));
+ printMethod.addParameter(printArg);
result.add(new NewEdgeOperation(printArg, TYPEOF, stringClazz));

booleanClazz = new Clazz("Boolean");
- result.add(new NewNodeOperation(booleanClazz, lang));
+ lang.addClazz(booleanClazz);

intClazz = new Clazz("Integer");
- result.add(new NewNodeOperation(intClazz, lang));
+ lang.addClazz(intClazz);

integerPlus = new Method("+");
- result.add(new NewNodeOperation(integerPlus, intClazz));
- result.add(new NewEdgeOperation(integerPlus, TYPEOF, intClazz));
- result.add(new NewNodeOperation(new Comment("Elements may have symbols
in their names." +
+ intClazz.addBlock(integerPlus);
+ intClazz.addComment(new Comment("Elements may have symbols in their
names." +
" Tools may choose to render this as infix",
- System.getProperty("user.name")), integerPlus));
+ System.getProperty("user.name")));
+ result.add(new NewEdgeOperation(integerPlus, TYPEOF, intClazz));

integerEquals = new Method("==");
- result.add(new NewNodeOperation(integerEquals, intClazz));
+ intClazz.addBlock(integerEquals);
result.add(new NewEdgeOperation(integerEquals, TYPEOF, booleanClazz));

Parameter integerPlusArg = new Parameter("i");
- result.add(new NewNodeOperation(integerPlusArg, integerPlus));
+ integerPlus.addParameter(integerPlusArg);
result.add(new NewEdgeOperation(integerPlusArg, TYPEOF, intClazz));

return result;
=======================================
--- /core/src/test/java/noop/graph/ArithmeticExample.java Wed Apr 21
09:10:37 2010
+++ /core/src/test/java/noop/graph/ArithmeticExample.java Fri Apr 23
03:26:30 2010
@@ -23,53 +23,52 @@
controller.apply(new NewNodeOperation(project));

Library library = new Library("adding stuff");
- controller.apply(new NewNodeOperation(library, project));
-
+ project.addLibrary(library);
+
+ Function entryPoint = new Function("start here");
+ library.addFunction(entryPoint);
Parameter consoleDep = new Parameter("console");
-
- Block entryPoint = new Function("start here");
+ entryPoint.addParameter(consoleDep);
controller.applyAll(asList(
- new NewNodeOperation(entryPoint, library),
new NewEdgeOperation(entryPoint, TYPEOF, stdLib.intClazz),
- new NewNodeOperation(consoleDep, entryPoint),
new NewEdgeOperation(consoleDep, TYPEOF, stdLib.consoleClazz)));

IdentifierDeclaration i = new IdentifierDeclaration("i");
- controller.apply(new NewNodeOperation(i, entryPoint));
+ entryPoint.addStatement(i);

IntegerLiteral one = new IntegerLiteral(1);
- controller.apply(new NewNodeOperation(one, i));
+ i.setInitialValue(one);

IdentifierDeclaration j = new IdentifierDeclaration("j");
- controller.apply(new NewNodeOperation(j, entryPoint));
+ entryPoint.addStatement(j);

IntegerLiteral two = new IntegerLiteral(2);
- controller.apply(new NewNodeOperation(two, j));
+ entryPoint.addStatement(two);

IdentifierDeclaration k = new IdentifierDeclaration("k");
- controller.apply(new NewNodeOperation(k, entryPoint));
+ entryPoint.addStatement(k);

Expression sum = new MethodInvocation();
controller.applyAll(asList(
- new NewNodeOperation(sum, k),
new NewEdgeOperation(sum, INVOKE, stdLib.integerPlus),
new NewEdgeOperation(sum, TARGET, i),
new NewEdgeOperation(sum, ARG, j)
));
+ k.setInitialValue(sum);

Expression printResult = new MethodInvocation();
+ entryPoint.addStatement(printResult);
controller.applyAll(asList(
- new NewNodeOperation(printResult, entryPoint),
new NewEdgeOperation(printResult, INVOKE, stdLib.printMethod),
new NewEdgeOperation(printResult, TARGET, consoleDep),
new NewEdgeOperation(printResult, ARG, k)
));

IntegerLiteral zero = new IntegerLiteral(0);
- controller.apply(new NewNodeOperation(zero, entryPoint));
+ entryPoint.addStatement(zero);

Expression returnVal = new Return();
- controller.applyAll(asList(new NewNodeOperation(returnVal, entryPoint),
- new NewEdgeOperation(returnVal, ARG, zero)));
+ entryPoint.addStatement(returnVal);
+ controller.apply(new NewEdgeOperation(returnVal, ARG, zero));
}
}
=======================================
--- /core/src/test/java/noop/graph/ControlFlowExample.java Thu Apr 22
02:43:30 2010
+++ /core/src/test/java/noop/graph/ControlFlowExample.java Fri Apr 23
03:26:30 2010
@@ -22,44 +22,43 @@
controller.apply(new NewNodeOperation(project));

Library library = new Library("Testing loops");
- controller.apply(new NewNodeOperation(library, project));
+ project.addLibrary(library);

Clazz clazz = new Clazz("Iterating Printer");
- controller.apply(new NewNodeOperation(clazz, library));
+ library.addClazz(clazz);

Method method = new Method("Print 1 through 10");
- controller.apply(new NewNodeOperation(method, clazz));
+ clazz.addBlock(method);

Parameter consoleDep = new Parameter("console");
- controller.apply(new NewNodeOperation(consoleDep, method));
-
+ method.addParameter(consoleDep);
+
IdentifierDeclaration b = new IdentifierDeclaration("count");
- controller.applyAll(asList(
- new NewNodeOperation(b, method),
- new NewEdgeOperation(b, TYPEOF, stdLib.booleanClazz)));
- IntegerLiteral initValue = new IntegerLiteral(0);
- controller.apply(new NewNodeOperation(initValue, b));
+ method.addStatement(b);
+ controller.apply(new NewEdgeOperation(b, TYPEOF, stdLib.booleanClazz));
+
+ b.setInitialValue(new IntegerLiteral(0));

Loop loop = new Loop();
- controller.apply(new NewNodeOperation(loop, method));
+ method.addStatement(loop);

IntegerLiteral ten = new IntegerLiteral(10);
- controller.apply(new NewNodeOperation(ten, method));
+ method.addStatement(ten);

Expression terminateWhen = new MethodInvocation();
+ loop.setTerminationCondition(terminateWhen);
controller.applyAll(asList(
- new NewNodeOperation(terminateWhen, loop),
new NewEdgeOperation(terminateWhen, TARGET, b),
new NewEdgeOperation(terminateWhen, INVOKE, stdLib.integerEquals),
new NewEdgeOperation(terminateWhen, ARG, ten)
));

Block body = new AnonymousBlock();
- controller.apply(new NewNodeOperation(body, loop));
+ loop.setBody(body);

Expression printValue = new MethodInvocation();
+ body.addStatement(printValue);
controller.applyAll(asList(
- new NewNodeOperation(printValue, body),
new NewEdgeOperation(printValue, TARGET, consoleDep),
new NewEdgeOperation(printValue, INVOKE, stdLib.printMethod),
new NewEdgeOperation(printValue, ARG, b)
=======================================
--- /core/src/test/java/noop/graph/DumpExamplesMain.java Thu Apr 22
02:43:30 2010
+++ /core/src/test/java/noop/graph/DumpExamplesMain.java Fri Apr 23
03:26:30 2010
@@ -40,12 +40,17 @@
public static void main(String[] args) throws FileNotFoundException {
new DumpExamplesMain(Output.DOT, new File(args[0])).run();
new DumpExamplesMain(Output.TXT, new File(args[0])).run();
+ new DumpExamplesMain(Output.XML, new File(args[0])).run();
}

public void run() throws FileNotFoundException {
StandardLibraryBuilder stdLib = new StandardLibraryBuilder();

for (Example example : Arrays.asList(
+ new Example(stdLib) {
+ @Override
+ public void createProgram(Controller controller) {}
+ },
new ArithmeticExample(stdLib),
new HelloWorldExample(stdLib),
new ControlFlowExample(stdLib))) {
@@ -55,7 +60,7 @@
controller.applyAll(stdLib.build());

example.createProgram(controller);
- File outFile = new File(outDir, example.getClass().getSimpleName()
+ "." + output.name().toLowerCase());
+ File outFile = new File(outDir, example.getClass().getName() + "." +
output.name().toLowerCase());
new WorkspaceDumper(output, new PrintStream(new
FileOutputStream(outFile))).dump(workspace);
}
}
=======================================
--- /core/src/test/java/noop/graph/HelloWorldExample.java Thu Apr 22
02:43:30 2010
+++ /core/src/test/java/noop/graph/HelloWorldExample.java Fri Apr 23
03:26:30 2010
@@ -22,55 +22,54 @@
controller.apply(new NewNodeOperation(project));

Library library = new Library("hello");
- controller.apply(new NewNodeOperation(library, project));
+ project.addLibrary(library);
+
+ Function sayHello = new Function("Say hello");
+ library.addFunction(sayHello);

Parameter consoleDep = new Parameter("console");
-
- Block sayHello = new Function("Say hello");
+ sayHello.addParameter(consoleDep);
+
controller.applyAll(asList(
- new NewNodeOperation(sayHello, library),
new NewEdgeOperation(sayHello, TYPEOF, stdLib.intClazz),
- new NewNodeOperation(consoleDep, sayHello),
new NewEdgeOperation(consoleDep, TYPEOF, stdLib.consoleClazz)));

- Documentation sayHelloDoc = new Documentation("This is the entry point
for the Hello World app",
- "alex...@google.com (Alex Eagle)");
- controller.apply(new NewNodeOperation(sayHelloDoc, sayHello));
+ sayHello.setDocumentation(new Documentation("This is the entry point
for the Hello World app",
+ "alex...@google.com (Alex Eagle)"));

StringLiteral helloWorld = new StringLiteral("Hello, World!");
- controller.applyAll(asList(
- new NewNodeOperation(helloWorld, sayHello),
- new NewEdgeOperation(helloWorld, TYPEOF, stdLib.stringClazz)));
+ sayHello.addStatement(helloWorld);
+ controller.apply(new NewEdgeOperation(helloWorld, TYPEOF,
stdLib.stringClazz));

Expression printHello = new MethodInvocation();
+ sayHello.addStatement(printHello);
controller.applyAll(asList(
- new NewNodeOperation(printHello, sayHello),
new NewEdgeOperation(printHello, TARGET, consoleDep),
- new NewEdgeOperation(printHello, INVOKE, stdLib.printMethod)));
- controller.apply(new NewEdgeOperation(printHello, ARG, helloWorld));
+ new NewEdgeOperation(printHello, INVOKE, stdLib.printMethod),
+ new NewEdgeOperation(printHello, ARG, helloWorld)));

IntegerLiteral zero = new IntegerLiteral(0);
+ sayHello.addStatement(zero);
+
Return aReturn = new Return();
+ sayHello.addStatement(aReturn);
controller.applyAll(asList(
- new NewNodeOperation(zero, sayHello),
new NewEdgeOperation(zero, TYPEOF, stdLib.intClazz),
- new NewNodeOperation(aReturn, sayHello),
new NewEdgeOperation(aReturn, ARG, zero)));

- Block unitTest = new UnitTest("Should say hello");
- controller.apply(new NewNodeOperation(unitTest, sayHello));
+ UnitTest unitTest = new UnitTest("Should say hello");
+ sayHello.addUnitTest(unitTest);

IdentifierDeclaration resultDecl = new IdentifierDeclaration("result");
- controller.applyAll(asList(
- new NewNodeOperation(resultDecl, unitTest),
- new NewEdgeOperation(resultDecl, TYPEOF, stdLib.intClazz)));
+ unitTest.addStatement(resultDecl);
+ controller.apply(new NewEdgeOperation(resultDecl, TYPEOF,
stdLib.intClazz));

Expression callMain = new MethodInvocation();
- controller.applyAll(asList(
- new NewNodeOperation(callMain, resultDecl),
- new NewEdgeOperation(callMain, INVOKE, sayHello)));
+ unitTest.addStatement(callMain);
+ controller.apply(new NewEdgeOperation(callMain, INVOKE, sayHello));

Expression assertion = new MethodInvocation();
- controller.apply(new NewNodeOperation(assertion, unitTest));
+ unitTest.addStatement(assertion);
+ // TODO: fill in assertion
}
}
=======================================
--- /core/src/test/java/noop/graph/WorkspaceDumper.java Wed Apr 21 09:10:37
2010
+++ /core/src/test/java/noop/graph/WorkspaceDumper.java Fri Apr 23 03:26:30
2010
@@ -1,5 +1,7 @@
package noop.graph;

+import com.thoughtworks.xstream.XStream;
+
import java.io.PrintStream;

/**
@@ -16,21 +18,23 @@
}

public enum Output {
- TXT, DOT
+ TXT, XML, DOT
}

public void dump(Workspace workspace) {
- PrintingVisitor graphPrintingVisitor;
switch (output) {
case DOT:
- graphPrintingVisitor = new DotGraphPrintingVisitor(out);
+ workspace.accept(new DotGraphPrintingVisitor(out));
break;
case TXT:
- graphPrintingVisitor = new OutlinePrintingVisitor(out);
+ workspace.accept(new OutlinePrintingVisitor(out));
+ break;
+ case XML:
+ XStream xStream = new XStream();
+ out.append(xStream.toXML(workspace));
break;
default:
throw new RuntimeException("unknown output type " + output);
}
- workspace.accept(graphPrintingVisitor);
}
}

==============================================================================
Revision: cf30c296cc
Author: Alex Eagle <alex...@google.com>
Date: Fri Apr 23 04:40:41 2010
Log: Improvements suggested in code review. (Thanks, Bobby!!)
http://code.google.com/p/noop/source/detail?r=cf30c296cc

Added:
/core/src/main/java/noop/model/EmptyDocumentation.java
/core/src/main/java/noop/operations/NewProjectOperation.java
Modified:
/core/src/main/java/noop/graph/Controller.java
/core/src/main/java/noop/model/Comment.java
/core/src/main/java/noop/model/LanguageElement.java
/core/src/main/java/noop/operations/EditNodeOperation.java
/core/src/main/java/noop/operations/MutationOperation.java
/core/src/main/java/noop/operations/NewEdgeOperation.java
/core/src/main/java/noop/operations/NewNodeOperation.java
/core/src/main/java/noop/stdlib/StandardLibraryBuilder.java
/core/src/test/java/noop/graph/ArithmeticExample.java
/core/src/test/java/noop/graph/ControlFlowExample.java
/core/src/test/java/noop/graph/HelloWorldExample.java

=======================================
--- /dev/null
+++ /core/src/main/java/noop/model/EmptyDocumentation.java Fri Apr 23
04:40:41 2010
@@ -0,0 +1,11 @@
+package noop.model;
+
+/**
+ * The Null Object for Documentation.
+ * @author alex...@google.com (Alex Eagle)
+ */
+public class EmptyDocumentation extends Documentation {
+ public EmptyDocumentation() {
+ super("", "");
+ }
+}
=======================================
--- /dev/null
+++ /core/src/main/java/noop/operations/NewProjectOperation.java Fri Apr 23
04:40:41 2010
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package noop.operations;
+
+import noop.graph.Controller;
+import noop.model.Project;
+
+/**
+ * @author alex...@google.com (Alex Eagle)
+ */
+public class NewProjectOperation implements MutationOperation {
+ public final Project project;
+
+ public NewProjectOperation(Project project) {
+ this.project = project;
+ }
+
+ @Override
+ public void execute(Controller controller) {
+ controller.addProject(this);
+ }
+}
=======================================
--- /core/src/main/java/noop/graph/Controller.java Fri Apr 23 03:26:30 2010
+++ /core/src/main/java/noop/graph/Controller.java Fri Apr 23 04:40:41 2010
@@ -18,10 +18,7 @@

import noop.graph.Edge.EdgeType;
import noop.model.LanguageElement;
-import noop.operations.EditNodeOperation;
-import noop.operations.MutationOperation;
-import noop.operations.NewEdgeOperation;
-import noop.operations.NewNodeOperation;
+import noop.operations.*;

/**
* @author alex...@google.com (Alex Eagle)
@@ -33,14 +30,10 @@
this.workspace = workspace;
}

- public void apply(NewNodeOperation operation) {
+ public void addNode(NewNodeOperation operation) {
int nextNodeId = workspace.elements.size();
LanguageElement container = operation.container == null ? workspace :
operation.container;

-// if (!container.adoptChild(operation.newElement)) {
-// throw new IllegalArgumentException("Element " +
operation.newElement
-// + " not allowed as child of " + container);
-// }
int destId = workspace.elements.indexOf(container);
if (destId < 0) {
throw new IllegalStateException(String.format("Cannot add edge [%s
-> %s] due to non-existant dest %s",
@@ -51,7 +44,7 @@
workspace.elements.add(operation.newElement);
}

- public void apply(EditNodeOperation operation) {
+ public void editNode(EditNodeOperation operation) {
LanguageElement currentValue = workspace.elements.get(operation.id);
if (currentValue.getClass() != operation.newValue.getClass()) {
throw new IllegalArgumentException(String.format("Cannot edit
node %d with %s because the current type is %s",
@@ -62,24 +55,22 @@
workspace.elements.set(operation.id, operation.newValue);
}

- public void apply(NewEdgeOperation operation) {
+ public void addEdge(NewEdgeOperation operation) {
workspace.edges.add(new Edge(workspace.elements.indexOf(operation.src),
operation.type, workspace.elements.indexOf(operation.dest)));
}
+
+ public void addProject(NewProjectOperation operation) {
+ workspace.addProject(operation.project);
+ }
+
+ public void apply(MutationOperation operation) {
+ operation.execute(this);
+ }

public void applyAll(Iterable<? extends MutationOperation> operations) {
for (MutationOperation operation : operations) {
apply(operation);
}
}
-
- private void apply(MutationOperation operation) {
- if (operation instanceof NewNodeOperation) {
- apply((NewNodeOperation)operation);
- } else if (operation instanceof EditNodeOperation) {
- apply((EditNodeOperation)operation);
- } else if (operation instanceof NewEdgeOperation) {
- apply((NewEdgeOperation)operation);
- }
- }
-}
+}
=======================================
--- /core/src/main/java/noop/model/Comment.java Fri Apr 23 03:26:30 2010
+++ /core/src/main/java/noop/model/Comment.java Fri Apr 23 04:40:41 2010
@@ -11,10 +11,10 @@
public final String user;
public final Instant timestamp;

- public Comment(String text, String user) {
+ public Comment(String text, String user, Instant timestamp) {
this.text = text;
this.user = user;
- this.timestamp = new Instant();
+ this.timestamp = timestamp;
}

@Override
=======================================
--- /core/src/main/java/noop/model/LanguageElement.java Fri Apr 23 03:26:30
2010
+++ /core/src/main/java/noop/model/LanguageElement.java Fri Apr 23 04:40:41
2010
@@ -28,17 +28,15 @@
* @author alex...@google.com (Alex Eagle)
*/
public abstract class LanguageElement<T> implements Serializable {
- protected Documentation documentation;
+ protected Documentation documentation = new EmptyDocumentation();
protected List<Comment> comments = Lists.newArrayList();
protected Set<UnitTest> unitTests = Sets.newHashSet();
protected T previousVersion;

public void accept(ModelVisitor v) {
- if (documentation != null) {
- v.enter(documentation);
- documentation.accept(v);
- v.leave(documentation);
- }
+ v.enter(documentation);
+ documentation.accept(v);
+ v.leave(documentation);
for (Comment comment : comments) {
v.enter(comment);
comment.accept(v);
=======================================
--- /core/src/main/java/noop/operations/EditNodeOperation.java Fri Apr 16
14:27:28 2010
+++ /core/src/main/java/noop/operations/EditNodeOperation.java Fri Apr 23
04:40:41 2010
@@ -16,6 +16,7 @@

package noop.operations;

+import noop.graph.Controller;
import noop.model.LanguageElement;

import java.io.Serializable;
@@ -31,4 +32,9 @@
this.id = id;
this.newValue = newValue;
}
-}
+
+ @Override
+ public void execute(Controller controller) {
+ controller.editNode(this);
+ }
+}
=======================================
--- /core/src/main/java/noop/operations/MutationOperation.java Fri Apr 16
14:27:28 2010
+++ /core/src/main/java/noop/operations/MutationOperation.java Fri Apr 23
04:40:41 2010
@@ -16,10 +16,13 @@

package noop.operations;

+import noop.graph.Controller;
+
import java.io.Serializable;

/**
* @author alex...@google.com (Alex Eagle)
*/
public interface MutationOperation extends Serializable {
-}
+ void execute(Controller controller);
+}
=======================================
--- /core/src/main/java/noop/operations/NewEdgeOperation.java Tue Apr 20
08:34:11 2010
+++ /core/src/main/java/noop/operations/NewEdgeOperation.java Fri Apr 23
04:40:41 2010
@@ -1,5 +1,6 @@
package noop.operations;

+import noop.graph.Controller;
import noop.graph.Edge.EdgeType;
import noop.model.LanguageElement;

@@ -16,4 +17,9 @@
this.type = type;
this.dest = dest;
}
-}
+
+ @Override
+ public void execute(Controller controller) {
+ controller.addEdge(this);
+ }
+}
=======================================
--- /core/src/main/java/noop/operations/NewNodeOperation.java Tue Apr 20
08:34:11 2010
+++ /core/src/main/java/noop/operations/NewNodeOperation.java Fri Apr 23
04:40:41 2010
@@ -16,6 +16,7 @@

package noop.operations;

+import noop.graph.Controller;
import noop.model.LanguageElement;

/**
@@ -35,12 +36,8 @@
this.container = container;
}

- /**
- * Create a new node whose parent is the workspace.
- * This may create orphaned elements, but is appropriate for projects
- * @param newElement the element
- */
- public NewNodeOperation(LanguageElement newElement) {
- this(newElement, null);
+ @Override
+ public void execute(Controller controller) {
+ controller.addNode(this);
}
}
=======================================
--- /core/src/main/java/noop/stdlib/StandardLibraryBuilder.java Fri Apr 23
03:26:30 2010
+++ /core/src/main/java/noop/stdlib/StandardLibraryBuilder.java Fri Apr 23
04:40:41 2010
@@ -4,7 +4,8 @@
import noop.model.*;
import noop.operations.MutationOperation;
import noop.operations.NewEdgeOperation;
-import noop.operations.NewNodeOperation;
+import noop.operations.NewProjectOperation;
+import org.joda.time.Instant;

import java.util.List;

@@ -28,7 +29,7 @@
List<MutationOperation> result = Lists.newArrayList();

Project project = new Project("Noop", "com.google.noop", "Apache 2");
- result.add(new NewNodeOperation(project));
+ result.add(new NewProjectOperation(project));

Library lang = new Library("lang");
project.addLibrary(lang);
@@ -63,7 +64,7 @@
intClazz.addBlock(integerPlus);
intClazz.addComment(new Comment("Elements may have symbols in their
names." +
" Tools may choose to render this as infix",
- System.getProperty("user.name")));
+ System.getProperty("user.name"), new Instant()));
result.add(new NewEdgeOperation(integerPlus, TYPEOF, intClazz));

integerEquals = new Method("==");
=======================================
--- /core/src/test/java/noop/graph/ArithmeticExample.java Fri Apr 23
03:26:30 2010
+++ /core/src/test/java/noop/graph/ArithmeticExample.java Fri Apr 23
04:40:41 2010
@@ -2,7 +2,7 @@

import noop.model.*;
import noop.operations.NewEdgeOperation;
-import noop.operations.NewNodeOperation;
+import noop.operations.NewProjectOperation;
import noop.stdlib.StandardLibraryBuilder;

import static java.util.Arrays.asList;
@@ -20,7 +20,7 @@
@Override
public void createProgram(Controller controller) {
Project project = new Project("Arithmetic", "com.example", "Copyright
2010\nExample Co.");
- controller.apply(new NewNodeOperation(project));
+ controller.apply(new NewProjectOperation(project));

Library library = new Library("adding stuff");
project.addLibrary(library);
=======================================
--- /core/src/test/java/noop/graph/ControlFlowExample.java Fri Apr 23
03:26:30 2010
+++ /core/src/test/java/noop/graph/ControlFlowExample.java Fri Apr 23
04:40:41 2010
@@ -2,7 +2,7 @@

import noop.model.*;
import noop.operations.NewEdgeOperation;
-import noop.operations.NewNodeOperation;
+import noop.operations.NewProjectOperation;
import noop.stdlib.StandardLibraryBuilder;

import static java.util.Arrays.asList;
@@ -19,7 +19,7 @@
@Override
public void createProgram(Controller controller) {
Project project = new Project("Control
Flow", "com.example", "Copyright 2010\nExample Co.");
- controller.apply(new NewNodeOperation(project));
+ controller.apply(new NewProjectOperation(project));

Library library = new Library("Testing loops");
project.addLibrary(library);
@@ -33,11 +33,11 @@
Parameter consoleDep = new Parameter("console");
method.addParameter(consoleDep);

- IdentifierDeclaration b = new IdentifierDeclaration("count");
- method.addStatement(b);
- controller.apply(new NewEdgeOperation(b, TYPEOF, stdLib.booleanClazz));
-
- b.setInitialValue(new IntegerLiteral(0));
+ IdentifierDeclaration i = new IdentifierDeclaration("count");
+ method.addStatement(i);
+ controller.apply(new NewEdgeOperation(i, TYPEOF, stdLib.intClazz));
+
+ i.setInitialValue(new IntegerLiteral(0));

Loop loop = new Loop();
method.addStatement(loop);
@@ -48,7 +48,7 @@
Expression terminateWhen = new MethodInvocation();
loop.setTerminationCondition(terminateWhen);
controller.applyAll(asList(
- new NewEdgeOperation(terminateWhen, TARGET, b),
+ new NewEdgeOperation(terminateWhen, TARGET, i),
new NewEdgeOperation(terminateWhen, INVOKE, stdLib.integerEquals),
new NewEdgeOperation(terminateWhen, ARG, ten)
));
@@ -61,7 +61,7 @@
controller.applyAll(asList(
new NewEdgeOperation(printValue, TARGET, consoleDep),
new NewEdgeOperation(printValue, INVOKE, stdLib.printMethod),
- new NewEdgeOperation(printValue, ARG, b)
+ new NewEdgeOperation(printValue, ARG, i)
));
}
}
=======================================
--- /core/src/test/java/noop/graph/HelloWorldExample.java Fri Apr 23
03:26:30 2010
+++ /core/src/test/java/noop/graph/HelloWorldExample.java Fri Apr 23
04:40:41 2010
@@ -2,7 +2,7 @@

import noop.model.*;
import noop.operations.NewEdgeOperation;
-import noop.operations.NewNodeOperation;
+import noop.operations.NewProjectOperation;
import noop.stdlib.StandardLibraryBuilder;

import static java.util.Arrays.asList;
@@ -19,7 +19,7 @@
@Override
public void createProgram(Controller controller) {
Project project = new Project("Hello World", "com.example", "Copyright
2010\nExample Co.");
- controller.apply(new NewNodeOperation(project));
+ controller.apply(new NewProjectOperation(project));

Library library = new Library("hello");
project.addLibrary(library);

==============================================================================
Revision: 91a7ad9170
Author: Alex Eagle <alex...@google.com>
Date: Fri Apr 23 04:53:28 2010
Log: Fix recursive allocation of EmptyDocumentation's in EmptyDocumentation
by separating Visitable from LanguageElement.
http://code.google.com/p/noop/source/detail?r=91a7ad9170

Added:
/core/src/main/java/noop/model/Visitable.java
Modified:
/core/src/main/java/noop/graph/Controller.java
/core/src/main/java/noop/graph/DotGraphPrintingVisitor.java
/core/src/main/java/noop/graph/ModelVisitor.java
/core/src/main/java/noop/graph/OutlinePrintingVisitor.java
/core/src/main/java/noop/graph/PrintingVisitor.java
/core/src/main/java/noop/model/Documentation.java
/core/src/main/java/noop/model/LanguageElement.java

=======================================
--- /dev/null
+++ /core/src/main/java/noop/model/Visitable.java Fri Apr 23 04:53:28 2010
@@ -0,0 +1,10 @@
+package noop.model;
+
+import noop.graph.ModelVisitor;
+
+/**
+ * @author alex...@google.com (Alex Eagle)
+ */
+public interface Visitable {
+ void accept(ModelVisitor v);
+}
=======================================
--- /core/src/main/java/noop/graph/Controller.java Fri Apr 23 04:40:41 2010
+++ /core/src/main/java/noop/graph/Controller.java Fri Apr 23 04:53:28 2010
@@ -56,8 +56,15 @@
}

public void addEdge(NewEdgeOperation operation) {
- workspace.edges.add(new Edge(workspace.elements.indexOf(operation.src),
- operation.type, workspace.elements.indexOf(operation.dest)));
+ int src = workspace.elements.indexOf(operation.src);
+ if (src < 0) {
+ throw new IllegalArgumentException("Src node doesn't exist: " +
operation.src);
+ }
+ int dest = workspace.elements.indexOf(operation.dest);
+ if (dest < 0) {
+ throw new IllegalArgumentException("Dest node doesn't exist: " +
operation.dest);
+ }
+ workspace.edges.add(new Edge(src, operation.type, dest));
}

public void addProject(NewProjectOperation operation) {
=======================================
--- /core/src/main/java/noop/graph/DotGraphPrintingVisitor.java Tue Apr 20
08:34:11 2010
+++ /core/src/main/java/noop/graph/DotGraphPrintingVisitor.java Fri Apr 23
04:53:28 2010
@@ -116,7 +116,7 @@

@Override
public void visit(Documentation documentation) {
- print(documentation, escape(documentation.summary), "shape=none");
+ out.format("%s [label=\"%s\"%s]\n", identityHashCode(documentation),
escape(documentation.summary), "shape=none");
}

protected String escape(String value) {
@@ -138,7 +138,7 @@
}

@Override
- public void leave(LanguageElement element) {
+ public void leave(Visitable element) {
super.leave(element);
if (currentDepth == 0) {
out.println("}");
=======================================
--- /core/src/main/java/noop/graph/ModelVisitor.java Thu Apr 22 02:43:30
2010
+++ /core/src/main/java/noop/graph/ModelVisitor.java Fri Apr 23 04:53:28
2010
@@ -22,9 +22,9 @@
* @author alex...@google.com (Alex Eagle)
*/
public abstract class ModelVisitor {
- public void enter(LanguageElement element) {}
-
- public void leave(LanguageElement element) {}
+ public void enter(Visitable element) {}
+
+ public void leave(Visitable element) {}

public void visit(Edge edge) {}

=======================================
--- /core/src/main/java/noop/graph/OutlinePrintingVisitor.java Thu Apr 22
02:43:30 2010
+++ /core/src/main/java/noop/graph/OutlinePrintingVisitor.java Fri Apr 23
04:53:28 2010
@@ -69,7 +69,7 @@

@Override
public void visit(Documentation documentation) {
- print(documentation, "Documentation: %s", documentation.summary);
+ out.format("%s%s\n", indent(), String.format("Documentation: %s",
documentation.summary));
}

@Override
=======================================
--- /core/src/main/java/noop/graph/PrintingVisitor.java Tue Apr 20 08:34:11
2010
+++ /core/src/main/java/noop/graph/PrintingVisitor.java Fri Apr 23 04:53:28
2010
@@ -1,6 +1,7 @@
package noop.graph;

import noop.model.LanguageElement;
+import noop.model.Visitable;

/**
* @author alex...@google.com (Alex Eagle)
@@ -10,12 +11,12 @@
protected int currentDepth;

@Override
- public void enter(LanguageElement element) {
+ public void enter(Visitable element) {
currentDepth++;
}

@Override
- public void leave(LanguageElement element) {
+ public void leave(Visitable element) {
currentDepth--;
}

=======================================
--- /core/src/main/java/noop/model/Documentation.java Thu Apr 22 02:43:30
2010
+++ /core/src/main/java/noop/model/Documentation.java Fri Apr 23 04:53:28
2010
@@ -21,7 +21,7 @@
/**
* @author alex...@google.com (Alex Eagle)
*/
-public class Documentation extends LanguageElement<Documentation> {
+public class Documentation implements Visitable {
public final String summary;
public final String author;

@@ -33,6 +33,5 @@
@Override
public void accept(ModelVisitor v) {
v.visit(this);
- super.accept(v);
}
}
=======================================
--- /core/src/main/java/noop/model/LanguageElement.java Fri Apr 23 04:40:41
2010
+++ /core/src/main/java/noop/model/LanguageElement.java Fri Apr 23 04:53:28
2010
@@ -27,12 +27,13 @@
/**
* @author alex...@google.com (Alex Eagle)
*/
-public abstract class LanguageElement<T> implements Serializable {
+public abstract class LanguageElement<T> implements Serializable,
Visitable {
protected Documentation documentation = new EmptyDocumentation();
protected List<Comment> comments = Lists.newArrayList();
protected Set<UnitTest> unitTests = Sets.newHashSet();
protected T previousVersion;

+ @Override
public void accept(ModelVisitor v) {
v.enter(documentation);
documentation.accept(v);

==============================================================================
Revision: 1b23ab128d
Author: Alex Eagle <alex...@google.com>
Date: Fri Apr 23 06:41:28 2010
Log: Prepare for serializing the model, by assigning each language element
it's own URI. Since libraries may depend on other libraries hosted
elsewhere, the URI is a UUID for the library, and then all the elements
inside can be treated as "local" so an index is sufficient. Will probably
also help performance later since the index is quick to look up.
http://code.google.com/p/noop/source/detail?r=1b23ab128d

Added:
/core/src/main/java/noop/graph/Vertex.java
/core/src/main/java/noop/graph/VertexCreatingVisitor.java
/core/src/test/java/noop/graph/VertexCreatingVisitorTest.java
Modified:
/core/src/main/java/noop/graph/Controller.java
/core/src/main/java/noop/graph/DotGraphPrintingVisitor.java
/core/src/main/java/noop/graph/Edge.java
/core/src/main/java/noop/graph/OutlinePrintingVisitor.java
/core/src/main/java/noop/graph/PrintingVisitor.java
/core/src/main/java/noop/graph/Workspace.java
/core/src/main/java/noop/model/LanguageElement.java
/core/src/main/java/noop/model/Library.java
/core/src/main/java/noop/stdlib/StandardLibraryBuilder.java
/core/src/test/java/noop/graph/ArithmeticExample.java
/core/src/test/java/noop/graph/ControlFlowExample.java
/core/src/test/java/noop/graph/ControllerTest.java
/core/src/test/java/noop/graph/DumpExamplesMain.java
/core/src/test/java/noop/graph/DumpExamplesTest.java
/core/src/test/java/noop/graph/HelloWorldExample.java

=======================================
--- /dev/null
+++ /core/src/main/java/noop/graph/Vertex.java Fri Apr 23 06:41:28 2010
@@ -0,0 +1,51 @@
+package noop.graph;
+
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+import java.util.UUID;
+
+/**
+ * A vertex in the semantic graph, which allows serializable references to
language elements.
+ * Each vertex is addressable by the library that contains it, and the
index of the vertex within the library.
+ * Edges have one Vertex as their source and one as the destination.
+ *
+ * @author alex...@google.com (Alex Eagle)
+ */
+public class Vertex {
+ public final UUID libraryUid;
+ public final int index;
+ public static final Vertex NONE = new Vertex(null, -1);
+
+ public Vertex(UUID libraryUid, int index) {
+ this.libraryUid = libraryUid;
+ this.index = index;
+ }
+
+ @Override
+ public int hashCode() {
+ return new
HashCodeBuilder().append(libraryUid).append(index).toHashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) { return false; }
+ if (obj == this) { return true; }
+ if (obj.getClass() != getClass()) {
+ return false;
+ }
+ Vertex rhs = (Vertex) obj;
+ return new EqualsBuilder()
+ .append(libraryUid, rhs.libraryUid)
+ .append(index, rhs.index)
+ .isEquals();
+ }
+
+ @Override
+ public String toString() {
+ if (this == NONE) {
+ return "NO_VERTEX";
+ }
+ return index + "(" + libraryUid.toString() + ")";
+ }
+}
=======================================
--- /dev/null
+++ /core/src/main/java/noop/graph/VertexCreatingVisitor.java Fri Apr 23
06:41:28 2010
@@ -0,0 +1,29 @@
+package noop.graph;
+
+import noop.model.LanguageElement;
+import noop.model.Library;
+import noop.model.Visitable;
+
+/**
+ * Creates the vertex in the element graph for each element encountered
which doesn't have one already.
+ * @author alex...@google.com (Alex Eagle)
+ */
+public class VertexCreatingVisitor extends ModelVisitor {
+ private Library currentLibrary;
+
+ @Override
+ public void visit(Library library) {
+ currentLibrary = library;
+ }
+
+ @Override
+ public void enter(Visitable v) {
+ if (currentLibrary != null && v instanceof LanguageElement) {
+ LanguageElement element = (LanguageElement) v;
+ if (element.vertex == Vertex.NONE) {
+ int nextIndex = currentLibrary.add(element);
+ element.vertex = new Vertex(currentLibrary.uid, nextIndex);
+ }
+ }
+ }
+}
=======================================
--- /dev/null
+++ /core/src/test/java/noop/graph/VertexCreatingVisitorTest.java Fri Apr
23 06:41:28 2010
@@ -0,0 +1,38 @@
+package noop.graph;
+
+import noop.model.Clazz;
+import noop.model.Library;
+import noop.model.Method;
+import noop.model.Project;
+import org.junit.Test;
+
+import java.util.UUID;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author alex...@google.com (Alex Eagle)
+ */
+public class VertexCreatingVisitorTest {
+ @Test
+ public void shouldCreateVerticesForEveryElementUnderAProject() {
+ Project p = new Project("example", "p", "MIT license");
+ UUID uid = UUID.randomUUID();
+ Library l = new Library(uid, "l");
+ Clazz c = new Clazz("c");
+ Method m = new Method("m");
+
+ p.addLibrary(l);
+ l.addClazz(c);
+ c.addBlock(m);
+
+ p.accept(new VertexCreatingVisitor());
+
+ assertEquals(l, l.getElements().get(0));
+ assertEquals(c, l.getElements().get(1));
+ assertEquals(m, l.getElements().get(2));
+
+ assertEquals(new Vertex(uid, 1), c.vertex);
+ assertEquals(new Vertex(uid, 2), m.vertex);
+ }
+}
=======================================
--- /core/src/main/java/noop/graph/Controller.java Fri Apr 23 04:53:28 2010
+++ /core/src/main/java/noop/graph/Controller.java Fri Apr 23 06:41:28 2010
@@ -16,7 +16,6 @@

package noop.graph;

-import noop.graph.Edge.EdgeType;
import noop.model.LanguageElement;
import noop.operations.*;

@@ -25,9 +24,11 @@
*/
public class Controller {
private Workspace workspace;
-
- public Controller(Workspace workspace) {
+ private final ModelVisitor addVertices;
+
+ public Controller(Workspace workspace, ModelVisitor addVertices) {
this.workspace = workspace;
+ this.addVertices = addVertices;
}

public void addNode(NewNodeOperation operation) {
@@ -39,8 +40,6 @@
throw new IllegalStateException(String.format("Cannot add edge [%s
-> %s] due to non-existant dest %s",
nextNodeId, destId, container));
}
- Edge newEdge = new Edge(destId, EdgeType.CONTAIN, nextNodeId);
- workspace.edges.add(newEdge);
workspace.elements.add(operation.newElement);
}

@@ -56,19 +55,18 @@
}

public void addEdge(NewEdgeOperation operation) {
- int src = workspace.elements.indexOf(operation.src);
- if (src < 0) {
- throw new IllegalArgumentException("Src node doesn't exist: " +
operation.src);
- }
- int dest = workspace.elements.indexOf(operation.dest);
- if (dest < 0) {
- throw new IllegalArgumentException("Dest node doesn't exist: " +
operation.dest);
- }
- workspace.edges.add(new Edge(src, operation.type, dest));
+ if (operation.src.vertex == Vertex.NONE) {
+ throw new IllegalArgumentException("src element has no vertex");
+ }
+ if (operation.dest.vertex == Vertex.NONE) {
+ throw new IllegalArgumentException("dest element has no vertex");
+ }
+ workspace.edges.add(new Edge(operation.src.vertex, operation.type,
operation.dest.vertex));
}

public void addProject(NewProjectOperation operation) {
workspace.addProject(operation.project);
+ operation.project.accept(addVertices);
}

public void apply(MutationOperation operation) {
=======================================
--- /core/src/main/java/noop/graph/DotGraphPrintingVisitor.java Fri Apr 23
04:53:28 2010
+++ /core/src/main/java/noop/graph/DotGraphPrintingVisitor.java Fri Apr 23
06:41:28 2010
@@ -48,9 +48,9 @@
if (additional.length > 0) {
attrs = ", " + attrs;
}
- out.format("%s [label=\"%s\"%s]\n", idFor(element), label, attrs);
- for (Edge edge : filter(workspace.edgesFrom(idFor(element)),
notContain())) {
- out.format("%d -> %d ", edge.src, edge.dest);
+ out.format("%s [label=\"%s\"%s]\n", element.vertex, label, attrs);
+ for (Edge edge : filter(workspace.edgesFrom(element.vertex),
notContain())) {
+ out.format("%s -> %s ", edge.src, edge.dest);
out.println("[label=\"" + edge.type.name().toLowerCase() + "\",
style=dashed]");
}
}
@@ -60,7 +60,7 @@
print(project, String.format("%s -> %s", project.getNamespace(),
project.getName()), "shape=box");
out.format("%s [label=\"%s\", shape=none]\n",
identityHashCode(project.getCopyright()),
escape(project.getCopyright()));
- out.format("%s -> %s\n", idFor(project),
identityHashCode(project.getCopyright()));
+ out.format("%s -> %s\n", project.vertex,
identityHashCode(project.getCopyright()));
}

@Override
=======================================
--- /core/src/main/java/noop/graph/Edge.java Thu Apr 22 02:43:30 2010
+++ /core/src/main/java/noop/graph/Edge.java Fri Apr 23 06:41:28 2010
@@ -24,7 +24,7 @@
* @author alex...@google.com (Alex Eagle)
*/
public class Edge {
- public Edge(int src, EdgeType type, int dest) {
+ public Edge(Vertex src, EdgeType type, Vertex dest) {
this.type = type;
this.src = src;
this.dest = dest;
@@ -53,8 +53,8 @@
}

public final EdgeType type;
- public final int src;
- public final int dest;
+ public final Vertex src;
+ public final Vertex dest;

@Override
public String toString() {
=======================================
--- /core/src/main/java/noop/graph/OutlinePrintingVisitor.java Fri Apr 23
04:53:28 2010
+++ /core/src/main/java/noop/graph/OutlinePrintingVisitor.java Fri Apr 23
06:41:28 2010
@@ -113,9 +113,9 @@
}

private void print(LanguageElement element, String message, String...
params) {
- out.format("%s%s [#%d]", indent(), String.format(message, params),
idFor(element));
- for (Edge edge : filter(workspace.edgesFrom(idFor(element)),
notContain())) {
- out.format(" %s -> #%d", edge.type.name(), edge.dest);
+ out.format("%s%s [#%s]", indent(), String.format(message, params),
element.vertex);
+ for (Edge edge : filter(workspace.edgesFrom(element.vertex),
notContain())) {
+ out.format(" %s -> #%s", edge.type.name(), edge.dest);
}
out.println();
}
=======================================
--- /core/src/main/java/noop/graph/PrintingVisitor.java Fri Apr 23 04:53:28
2010
+++ /core/src/main/java/noop/graph/PrintingVisitor.java Fri Apr 23 06:41:28
2010
@@ -1,6 +1,5 @@
package noop.graph;

-import noop.model.LanguageElement;
import noop.model.Visitable;

/**
@@ -19,10 +18,6 @@
public void leave(Visitable element) {
currentDepth--;
}
-
- protected int idFor(LanguageElement element) {
- return workspace.elements.indexOf(element);
- }

protected String escape(String value) {
return value.replaceAll("\n", "\\\\n");
=======================================
--- /core/src/main/java/noop/graph/Workspace.java Fri Apr 23 03:26:30 2010
+++ /core/src/main/java/noop/graph/Workspace.java Fri Apr 23 06:41:28 2010
@@ -59,11 +59,11 @@
v.leave(this);
}

- public Iterable<Edge> edgesFrom(final int id) {
+ public Iterable<Edge> edgesFrom(final Vertex src) {
return Iterables.filter(edges, new Predicate<Edge>() {
@Override
public boolean apply(@Nullable Edge input) {
- return input.src == id;
+ return input.src == src;
}
});
}
=======================================
--- /core/src/main/java/noop/model/LanguageElement.java Fri Apr 23 04:53:28
2010
+++ /core/src/main/java/noop/model/LanguageElement.java Fri Apr 23 06:41:28
2010
@@ -19,6 +19,7 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import noop.graph.ModelVisitor;
+import noop.graph.Vertex;

import java.io.Serializable;
import java.util.List;
@@ -28,6 +29,7 @@
* @author alex...@google.com (Alex Eagle)
*/
public abstract class LanguageElement<T> implements Serializable,
Visitable {
+ public Vertex vertex = Vertex.NONE;
protected Documentation documentation = new EmptyDocumentation();
protected List<Comment> comments = Lists.newArrayList();
protected Set<UnitTest> unitTests = Sets.newHashSet();
=======================================
--- /core/src/main/java/noop/model/Library.java Fri Apr 23 03:26:30 2010
+++ /core/src/main/java/noop/model/Library.java Fri Apr 23 06:41:28 2010
@@ -16,20 +16,25 @@

package noop.model;

+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import noop.graph.ModelVisitor;

import java.util.List;
+import java.util.UUID;

/**
* @author alex...@google.com (Alex Eagle)
*/
public class Library extends LanguageElement<Library> {
+ public final UUID uid;
public final String name;
+ private final List<LanguageElement> elements =
Lists.<LanguageElement>newArrayList(this);
private final List<Clazz> classes = Lists.newArrayList();
private final List<Block> functions = Lists.newArrayList();

- public Library(String name) {
+ public Library(UUID uid, String name) {
+ this.uid = uid;
this.name = name;
}

@@ -56,4 +61,13 @@
}
super.accept(v);
}
-}
+
+ public List<LanguageElement> getElements() {
+ return ImmutableList.copyOf(elements);
+ }
+
+ public int add(LanguageElement languageElement) {
+ elements.add(languageElement);
+ return elements.size() - 1;
+ }
+}
=======================================
--- /core/src/main/java/noop/stdlib/StandardLibraryBuilder.java Fri Apr 23
04:40:41 2010
+++ /core/src/main/java/noop/stdlib/StandardLibraryBuilder.java Fri Apr 23
06:41:28 2010
@@ -1,13 +1,12 @@
package noop.stdlib;

-import com.google.common.collect.Lists;
+import noop.graph.Controller;
import noop.model.*;
-import noop.operations.MutationOperation;
import noop.operations.NewEdgeOperation;
import noop.operations.NewProjectOperation;
import org.joda.time.Instant;

-import java.util.List;
+import java.util.UUID;

import static noop.graph.Edge.EdgeType.TYPEOF;

@@ -25,13 +24,11 @@
public Method integerPlus;
public Method integerEquals;

- public List<MutationOperation> build() {
- List<MutationOperation> result = Lists.newArrayList();
+ public void build(Controller controller) {

Project project = new Project("Noop", "com.google.noop", "Apache 2");
- result.add(new NewProjectOperation(project));
-
- Library lang = new Library("lang");
+
+ Library lang = new Library(UUID.randomUUID(), "lang");
project.addLibrary(lang);

stringClazz = new Clazz("String");
@@ -40,7 +37,7 @@
voidClazz = new Clazz("Void");
lang.addClazz(voidClazz);

- Library io = new Library("io");
+ Library io = new Library(UUID.randomUUID(), "io");
project.addLibrary(io);

consoleClazz = new Clazz("Console");
@@ -48,11 +45,9 @@

printMethod = new Method("print");
consoleClazz.addBlock(printMethod);
- result.add(new NewEdgeOperation(printMethod, TYPEOF, voidClazz));

Parameter printArg = new Parameter("s");
printMethod.addParameter(printArg);
- result.add(new NewEdgeOperation(printArg, TYPEOF, stringClazz));

booleanClazz = new Clazz("Boolean");
lang.addClazz(booleanClazz);
@@ -65,16 +60,18 @@
intClazz.addComment(new Comment("Elements may have symbols in their
names." +
" Tools may choose to render this as infix",
System.getProperty("user.name"), new Instant()));
- result.add(new NewEdgeOperation(integerPlus, TYPEOF, intClazz));

integerEquals = new Method("==");
intClazz.addBlock(integerEquals);
- result.add(new NewEdgeOperation(integerEquals, TYPEOF, booleanClazz));

Parameter integerPlusArg = new Parameter("i");
integerPlus.addParameter(integerPlusArg);
- result.add(new NewEdgeOperation(integerPlusArg, TYPEOF, intClazz));
-
- return result;
+
+ controller.apply(new NewProjectOperation(project));
+ controller.apply(new NewEdgeOperation(printMethod, TYPEOF, voidClazz));
+ controller.apply(new NewEdgeOperation(printArg, TYPEOF, stringClazz));
+ controller.apply(new NewEdgeOperation(integerPlus, TYPEOF, intClazz));
+ controller.apply(new NewEdgeOperation(integerEquals, TYPEOF,
booleanClazz));
+ controller.apply(new NewEdgeOperation(integerPlusArg, TYPEOF,
intClazz));
}
}
=======================================
--- /core/src/test/java/noop/graph/ArithmeticExample.java Fri Apr 23
04:40:41 2010
+++ /core/src/test/java/noop/graph/ArithmeticExample.java Fri Apr 23
06:41:28 2010
@@ -5,6 +5,8 @@
import noop.operations.NewProjectOperation;
import noop.stdlib.StandardLibraryBuilder;

+import java.util.UUID;
+
import static java.util.Arrays.asList;
import static noop.graph.Edge.EdgeType.*;

@@ -22,7 +24,7 @@
Project project = new Project("Arithmetic", "com.example", "Copyright
2010\nExample Co.");
controller.apply(new NewProjectOperation(project));

- Library library = new Library("adding stuff");
+ Library library = new Library(UUID.randomUUID(), "adding stuff");
project.addLibrary(library);

Function entryPoint = new Function("start here");
=======================================
--- /core/src/test/java/noop/graph/ControlFlowExample.java Fri Apr 23
04:40:41 2010
+++ /core/src/test/java/noop/graph/ControlFlowExample.java Fri Apr 23
06:41:28 2010
@@ -5,6 +5,8 @@
import noop.operations.NewProjectOperation;
import noop.stdlib.StandardLibraryBuilder;

+import java.util.UUID;
+
import static java.util.Arrays.asList;
import static noop.graph.Edge.EdgeType.*;

@@ -21,7 +23,7 @@
Project project = new Project("Control
Flow", "com.example", "Copyright 2010\nExample Co.");
controller.apply(new NewProjectOperation(project));

- Library library = new Library("Testing loops");
+ Library library = new Library(UUID.randomUUID(), "Testing loops");
project.addLibrary(library);

Clazz clazz = new Clazz("Iterating Printer");
=======================================
--- /core/src/test/java/noop/graph/ControllerTest.java Tue Apr 20 08:34:11
2010
+++ /core/src/test/java/noop/graph/ControllerTest.java Fri Apr 23 06:41:28
2010
@@ -37,7 +37,7 @@
@Before
public void setUp() {
workspace = new Workspace();
- controller = new Controller(workspace);
+ controller = new Controller(workspace, new VertexCreatingVisitor());
}

@Test public void shouldMakeNewProject() {
@@ -45,7 +45,7 @@
controller.apply(new NewNodeOperation(newNode, workspace));
assertTrue(workspace.elements.contains(newNode));
assertEquals(1, workspace.edges.size());
- assertEquals(new Edge(0, CONTAIN, 1),
workspace.edges.iterator().next());
+ assertEquals(new Edge(new Vertex(null, 0), CONTAIN, new Vertex(null,
1)), workspace.edges.iterator().next());
}

@Test public void shouldCreateAdditionalEdges() {
@@ -56,9 +56,9 @@
controller.apply(new NewNodeOperation(newNode, workspace));
controller.apply(new NewEdgeOperation(newNode, TYPEOF, stringType));
assertEquals(3, workspace.edges.size());
- assertTrue(workspace.edges.contains(new Edge(0, CONTAIN, 1)));
- assertTrue(workspace.edges.contains(new Edge(0, CONTAIN, 2)));
- assertTrue(workspace.edges.contains(new Edge(2, TYPEOF, 1)));
+ assertTrue(workspace.edges.contains(new Edge(new Vertex(null, 0),
CONTAIN, new Vertex(null, 1))));
+ assertTrue(workspace.edges.contains(new Edge(new Vertex(null, 0),
CONTAIN, new Vertex(null, 2))));
+ assertTrue(workspace.edges.contains(new Edge(new Vertex(null, 2),
TYPEOF, new Vertex(null, 1))));
}

@Test public void shouldAllowEditingAStringLiteral() {
=======================================
--- /core/src/test/java/noop/graph/DumpExamplesMain.java Fri Apr 23
03:26:30 2010
+++ /core/src/test/java/noop/graph/DumpExamplesMain.java Fri Apr 23
06:41:28 2010
@@ -50,14 +50,15 @@
new Example(stdLib) {
@Override
public void createProgram(Controller controller) {}
- },
- new ArithmeticExample(stdLib),
- new HelloWorldExample(stdLib),
- new ControlFlowExample(stdLib))) {
+ }
+// new ArithmeticExample(stdLib),
+// new HelloWorldExample(stdLib),
+// new ControlFlowExample(stdLib)
+ )) {
Workspace workspace = new Workspace();

- Controller controller = new Controller(workspace);
- controller.applyAll(stdLib.build());
+ Controller controller = new Controller(workspace, new
VertexCreatingVisitor());
+ stdLib.build(controller);

example.createProgram(controller);
File outFile = new File(outDir, example.getClass().getName() + "." +
output.name().toLowerCase());
=======================================
--- /core/src/test/java/noop/graph/DumpExamplesTest.java Thu Apr 22
02:43:30 2010
+++ /core/src/test/java/noop/graph/DumpExamplesTest.java Fri Apr 23
06:41:28 2010
@@ -18,8 +18,8 @@
public void setUp() {
workspace = new Workspace();
stdLib = new StandardLibraryBuilder();
- controller = new Controller(workspace);
- controller.applyAll(stdLib.build());
+ controller = new Controller(workspace, new VertexCreatingVisitor());
+ stdLib.build(controller);
}

@Test
=======================================
--- /core/src/test/java/noop/graph/HelloWorldExample.java Fri Apr 23
04:40:41 2010
+++ /core/src/test/java/noop/graph/HelloWorldExample.java Fri Apr 23
06:41:28 2010
@@ -5,6 +5,8 @@
import noop.operations.NewProjectOperation;
import noop.stdlib.StandardLibraryBuilder;

+import java.util.UUID;
+
import static java.util.Arrays.asList;
import static noop.graph.Edge.EdgeType.*;

@@ -21,7 +23,7 @@
Project project = new Project("Hello World", "com.example", "Copyright
2010\nExample Co.");
controller.apply(new NewProjectOperation(project));

- Library library = new Library("hello");
+ Library library = new Library(UUID.randomUUID(), "hello");
project.addLibrary(library);

Function sayHello = new Function("Say hello");

--
You received this message because you are subscribed to the Google Groups "Noop project changes from the version control system" group.
To post to this group, send email to noop-c...@googlegroups.com.
To unsubscribe from this group, send email to noop-changes...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/noop-changes?hl=en.

Reply all
Reply to author
Forward
0 new messages