Small refactor in JsObjectLiteral.
Change-Id: Ia937d5bd5b1b7286ecc481cbafcca7c3e0e0de03
diff --git a/dev/core/src/com/google/gwt/dev/js/CoverageInstrumentor.java b/dev/core/src/com/google/gwt/dev/js/CoverageInstrumentor.java
index 2ca63b4..f937102 100644
--- a/dev/core/src/com/google/gwt/dev/js/CoverageInstrumentor.java
+++ b/dev/core/src/com/google/gwt/dev/js/CoverageInstrumentor.java
@@ -27,13 +27,10 @@
import com.google.gwt.dev.js.ast.JsNumberLiteral;
import com.google.gwt.dev.js.ast.JsObjectLiteral;
import com.google.gwt.dev.js.ast.JsProgram;
-import com.google.gwt.dev.js.ast.JsPropertyInitializer;
import com.google.gwt.dev.js.ast.JsStringLiteral;
import com.google.gwt.thirdparty.guava.common.annotations.VisibleForTesting;
import com.google.gwt.thirdparty.guava.common.collect.Multimap;
-import java.util.List;
-
/**
* Instruments the generated JavaScript to record code coverage information
* about the original Java source.
@@ -77,21 +74,15 @@
@VisibleForTesting
static JsObjectLiteral baselineCoverage(SourceInfo info,
Multimap<String, Integer> instrumentableLines) {
- JsObjectLiteral baseline = new JsObjectLiteral(info);
- List<JsPropertyInitializer> properties = baseline.getPropertyInitializers();
+ JsObjectLiteral.Builder baselineBuilder = JsObjectLiteral.builder().setSourceInfo(info);
for (String filename : instrumentableLines.keySet()) {
- JsPropertyInitializer pair = new JsPropertyInitializer(info);
- pair.setLabelExpr(new JsStringLiteral(info, filename));
- JsObjectLiteral lines = new JsObjectLiteral(info);
- List<JsPropertyInitializer> coverage = lines.getPropertyInitializers();
+ JsObjectLiteral.Builder linesBuilder = JsObjectLiteral.builder().setSourceInfo(info);
for (int line : instrumentableLines.get(filename)) {
- coverage.add(new JsPropertyInitializer(info,
- new JsNumberLiteral(info, line), new JsNumberLiteral(info, 0)));
+ linesBuilder.add(new JsNumberLiteral(info, line), new JsNumberLiteral(info, 0));
}
- pair.setValueExpr(lines);
- properties.add(pair);
+ baselineBuilder.add(new JsStringLiteral(info, filename), linesBuilder.build());
}
- return baseline;
+ return baselineBuilder.build();
}
private Multimap<String, Integer> instrumentableLines;
diff --git a/dev/core/src/com/google/gwt/dev/js/JsParser.java b/dev/core/src/com/google/gwt/dev/js/JsParser.java
index 7b58712..370aff7 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsParser.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsParser.java
@@ -51,7 +51,6 @@
import com.google.gwt.dev.js.ast.JsParameter;
import com.google.gwt.dev.js.ast.JsPostfixOperation;
import com.google.gwt.dev.js.ast.JsPrefixOperation;
-import com.google.gwt.dev.js.ast.JsPropertyInitializer;
import com.google.gwt.dev.js.ast.JsRegExp;
import com.google.gwt.dev.js.ast.JsReturn;
import com.google.gwt.dev.js.ast.JsRootScope;
@@ -845,7 +844,8 @@
}
private JsExpression mapObjectLit(Node objLitNode) throws JsParserException {
- JsObjectLiteral toLit = new JsObjectLiteral(makeSourceInfo(objLitNode));
+ JsObjectLiteral.Builder objectLiteralBuilder = JsObjectLiteral.builder()
+ .setSourceInfo(makeSourceInfo(objLitNode));
Node fromPropInit = objLitNode.getFirstChild();
while (fromPropInit != null) {
@@ -861,17 +861,14 @@
+ toLabelExpr, objLitNode);
}
JsExpression toValueExpr = mapExpression(fromValueExpr);
-
- JsPropertyInitializer toPropInit = new JsPropertyInitializer(
- makeSourceInfo(fromLabelExpr), toLabelExpr, toValueExpr);
- toLit.getPropertyInitializers().add(toPropInit);
+ objectLiteralBuilder.add(makeSourceInfo(fromLabelExpr), toLabelExpr, toValueExpr);
// Begin the next property initializer, if there is one.
//
fromPropInit = fromPropInit.getNext();
}
- return toLit;
+ return objectLiteralBuilder.build();
}
private JsExpression mapOptionalExpression(Node exprNode)
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsObjectLiteral.java b/dev/core/src/com/google/gwt/dev/js/ast/JsObjectLiteral.java
index f60c448..3d9a71b 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsObjectLiteral.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsObjectLiteral.java
@@ -14,8 +14,9 @@
package com.google.gwt.dev.js.ast;
import com.google.gwt.dev.jjs.SourceInfo;
+import com.google.gwt.dev.jjs.SourceOrigin;
+import com.google.gwt.thirdparty.guava.common.collect.Lists;
-import java.util.ArrayList;
import java.util.List;
/**
@@ -23,7 +24,57 @@
*/
public final class JsObjectLiteral extends JsLiteral {
- private final List<JsPropertyInitializer> properties = new ArrayList<JsPropertyInitializer>();
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ /**
+ * Builder class for JsObjectLiterals.
+ */
+ public static class Builder {
+
+ private Builder() { }
+
+ private List<JsPropertyInitializer> propertyInitializers = Lists.newArrayList();
+ private SourceInfo sourceInfo = SourceOrigin.UNKNOWN;
+ private boolean internable = false;
+
+ public Builder add(String property, JsExpression value) {
+ add(new JsNameRef(sourceInfo, property), value);
+ return this;
+ }
+
+ public Builder add(JsExpression property, JsExpression value) {
+ add(sourceInfo, property, value);
+ return this;
+ }
+
+ public Builder add(SourceInfo sourceInfo, JsExpression property, JsExpression value) {
+ propertyInitializers.add(new JsPropertyInitializer(sourceInfo, property, value));
+ return this;
+ }
+
+ public Builder setSourceInfo(SourceInfo info) {
+ sourceInfo = info;
+ return this;
+ }
+
+ public Builder setInternable() {
+ internable = true;
+ return this;
+ }
+
+ public JsObjectLiteral build() {
+ JsObjectLiteral objectLiteral = new JsObjectLiteral(sourceInfo);
+ objectLiteral.getPropertyInitializers().addAll(propertyInitializers);
+ if (internable) {
+ objectLiteral.setInternable();
+ }
+ return objectLiteral;
+ }
+ }
+
+ private final List<JsPropertyInitializer> properties = Lists.newArrayList();
private boolean internable = false;
@@ -40,6 +91,15 @@
properties.add(new JsPropertyInitializer(sourceInfo, label, value));
}
+ /**
+ * Adds a property and its initial value to the object literal.
+ * <p>
+ * NOTE: Does not check for duplicate names.
+ */
+ public void addProperty(SourceInfo sourceInfo, String label, JsExpression value) {
+ addProperty(sourceInfo, new JsStringLiteral(sourceInfo, label), value);
+ }
+
@Override
public boolean equals(Object that) {
if (that == null || this.getClass() != that.getClass()) {