From 4945f8c9f5606e6c9226ee439787891a2fbb6a21 Mon Sep 17 00:00:00 2001 From: pTalanov Date: Tue, 28 Feb 2012 21:17:43 +0400 Subject: [PATCH] TODO fixes Analyzer -> Analyzer Facade Refactor for translators. Fix a bug with scopes. --- .../{Analyzer.java => AnalyzerFacade.java} | 14 ++++++-------- .../jetbrains/k2js/facade/K2JSTranslator.java | 8 ++++---- .../k2js/translate/context/NamingScope.java | 16 ++-------------- .../k2js/translate/context/StaticContext.java | 1 + .../translate/declaration/ClassTranslator.java | 6 ++---- .../NamespaceDeclarationTranslator.java | 4 ++-- .../declaration/NamespaceTranslator.java | 8 ++------ .../expression/FunctionTranslator.java | 18 +++++++++--------- .../expression/foreach/ArrayForTranslator.java | 7 +++---- .../expression/foreach/ForTranslator.java | 9 ++++----- .../foreach/IteratorForTranslator.java | 5 +++-- .../expression/foreach/RangeForTranslator.java | 8 ++++---- .../foreach/RangeLiteralForTranslator.java | 4 ++-- .../ClassInitializerTranslator.java | 6 ++++-- .../NamespaceInitializerTranslator.java | 4 ++-- .../k2js/translate/utils/JsAstUtils.java | 18 ++++++++++++++++++ 16 files changed, 68 insertions(+), 68 deletions(-) rename js/js.translator/src/org/jetbrains/k2js/analyze/{Analyzer.java => AnalyzerFacade.java} (92%) diff --git a/js/js.translator/src/org/jetbrains/k2js/analyze/Analyzer.java b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacade.java similarity index 92% rename from js/js.translator/src/org/jetbrains/k2js/analyze/Analyzer.java rename to js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacade.java index 9337a34131a..890f0624499 100644 --- a/js/js.translator/src/org/jetbrains/k2js/analyze/Analyzer.java +++ b/js/js.translator/src/org/jetbrains/k2js/analyze/AnalyzerFacade.java @@ -24,7 +24,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.Configuration; import org.jetbrains.jet.lang.JetSemanticServices; -import org.jetbrains.jet.lang.StandardConfiguration; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.psi.JetFile; @@ -40,9 +39,9 @@ import java.util.List; /** * @author Pavel Talanov */ -public final class Analyzer { +public final class AnalyzerFacade { - private Analyzer() { + private AnalyzerFacade() { } @NotNull @@ -58,10 +57,10 @@ public final class Analyzer { @NotNull Config config) { Project project = config.getProject(); return AnalyzingUtils.analyzeFiles(project, - JsConfiguration.jsLibConfiguration(project), - withJsLibAdded(files, config), - notLibFiles(config.getLibFiles()), - JetControlFlowDataTraceFactory.EMPTY); + JsConfiguration.jsLibConfiguration(project), + withJsLibAdded(files, config), + notLibFiles(config.getLibFiles()), + JetControlFlowDataTraceFactory.EMPTY); } private static void checkForErrors(@NotNull List allFiles, @NotNull BindingContext bindingContext) { @@ -105,7 +104,6 @@ public final class Analyzer { JetControlFlowDataTraceFactory.EMPTY, bindingTraceContext, semanticServices); -// return AnalyzerFacade.analyzeOneFileWithJavaIntegration(file, flowDataTraceFactory); } private static final class JsConfiguration implements Configuration { diff --git a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java index 09461d0d0f8..7840ead283d 100644 --- a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java @@ -23,7 +23,7 @@ import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.JetStandardLibrary; import org.jetbrains.jet.plugin.JetMainDetector; -import org.jetbrains.k2js.analyze.Analyzer; +import org.jetbrains.k2js.analyze.AnalyzerFacade; import org.jetbrains.k2js.config.Config; import org.jetbrains.k2js.config.IDEAConfig; import org.jetbrains.k2js.generate.CodeGenerator; @@ -113,15 +113,15 @@ public final class K2JSTranslator { @NotNull public BindingContext analyzeProgramCode(@NotNull String programText) { JetFile file = JetFileUtils.createPsiFile("test", programText, getProject()); - return Analyzer.analyzeFiles(Arrays.asList(file), config); + return AnalyzerFacade.analyzeFiles(Arrays.asList(file), config); } @NotNull public JsProgram generateProgram(@NotNull List filesToTranslate) { JetStandardLibrary.initialize(config.getProject()); - BindingContext bindingContext = Analyzer.analyzeFilesAndCheckErrors(filesToTranslate, config); - return Translation.generateAst(bindingContext, Analyzer.withJsLibAdded(filesToTranslate, config)); + BindingContext bindingContext = AnalyzerFacade.analyzeFilesAndCheckErrors(filesToTranslate, config); + return Translation.generateAst(bindingContext, AnalyzerFacade.withJsLibAdded(filesToTranslate, config)); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/NamingScope.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/NamingScope.java index 6b267859ab2..122bad33a81 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/NamingScope.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/NamingScope.java @@ -19,8 +19,7 @@ package org.jetbrains.k2js.translate.context; import com.google.dart.compiler.backend.js.ast.JsName; import com.google.dart.compiler.backend.js.ast.JsScope; import org.jetbrains.annotations.NotNull; - -import java.util.Iterator; +import org.jetbrains.k2js.translate.utils.JsAstUtils; /** * @author Pavel Talanov @@ -80,7 +79,7 @@ public final class NamingScope { String result = name; while (true) { JsName existingNameWithSameIdent = scope.findExistingName(result); - boolean isDuplicate = (existingNameWithSameIdent != null) && ownsName(scope, existingNameWithSameIdent); + boolean isDuplicate = (existingNameWithSameIdent != null) && JsAstUtils.ownsName(scope, existingNameWithSameIdent); if (!isDuplicate) break; @@ -90,17 +89,6 @@ public final class NamingScope { return result; } - //TODO: util? - private static boolean ownsName(@NotNull JsScope scope, @NotNull JsName name) { - Iterator nameIterator = scope.getAllNames(); - while (nameIterator.hasNext()) { - if (nameIterator.next() == name) { - return true; - } - } - return false; - } - @NotNull public JsName declareTemporary() { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java index b588c225ecc..bb3de688359 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java @@ -323,6 +323,7 @@ public final class StaticContext { } } + @NotNull private NamingScope getEnclosingScope(@NotNull DeclarationDescriptor descriptor) { DeclarationDescriptor containingDeclaration = getContainingDeclaration(descriptor); return getScopeForDescriptor(containingDeclaration.getOriginal()); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java index 35c86f5dc6d..75c2071bbe6 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java @@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.psi.JetParameter; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.general.Translation; +import org.jetbrains.k2js.translate.utils.JsAstUtils; import java.util.ArrayList; import java.util.List; @@ -165,10 +166,7 @@ public final class ClassTranslator extends AbstractTranslator { } propertyList.addAll(translatePropertiesAsConstructorParameters()); propertyList.addAll(declarationBodyVisitor.traverseClass(classDeclaration, context())); - //TODO: util? - JsObjectLiteral jsObjectLiteral = new JsObjectLiteral(); - jsObjectLiteral.getPropertyInitializers().addAll(propertyList); - return jsObjectLiteral; + return JsAstUtils.newObjectLiteral(propertyList); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceDeclarationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceDeclarationTranslator.java index 4309096dd25..cbff606f420 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceDeclarationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceDeclarationTranslator.java @@ -100,7 +100,7 @@ public final class NamespaceDeclarationTranslator extends AbstractTranslator { } @NotNull - private List declarationStatements(@NotNull List namespaceTranslators) { + private static List declarationStatements(@NotNull List namespaceTranslators) { List result = Lists.newArrayList(); for (NamespaceTranslator translator : namespaceTranslators) { result.add(translator.getDeclarationStatement()); @@ -109,7 +109,7 @@ public final class NamespaceDeclarationTranslator extends AbstractTranslator { } @NotNull - private List initializeStatements(@NotNull List namespaceTranslators) { + private static List initializeStatements(@NotNull List namespaceTranslators) { List result = Lists.newArrayList(); for (NamespaceTranslator translator : namespaceTranslators) { result.add(translator.getInitializeStatement()); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java index f026b6aed24..6f7380e1040 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java @@ -29,8 +29,7 @@ import org.jetbrains.k2js.translate.utils.BindingUtils; import java.util.ArrayList; import java.util.List; -import static org.jetbrains.k2js.translate.utils.JsAstUtils.newVar; -import static org.jetbrains.k2js.translate.utils.JsAstUtils.setQualifier; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; /** * @author Pavel.Talanov @@ -96,9 +95,6 @@ public final class NamespaceTranslator extends AbstractTranslator { List propertyList = new ArrayList(); propertyList.add(Translation.generateNamespaceInitializerMethod(descriptor, context())); propertyList.addAll(new DeclarationBodyVisitor().traverseNamespace(descriptor, context())); - //TODO: make util, search for dups - JsObjectLiteral jsObjectLiteral = new JsObjectLiteral(); - jsObjectLiteral.getPropertyInitializers().addAll(propertyList); - return jsObjectLiteral; + return newObjectLiteral(propertyList); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java index 6441f04b066..eeca826c737 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java @@ -128,15 +128,15 @@ public final class FunctionTranslator extends AbstractTranslator { @NotNull private JsFunction createFunctionObject() { - if (isDeclaration()) { - return context().getFunctionObject(descriptor); - } - if (isLiteral()) { - //TODO: changing this piece of code to more natural "same as for declaration" results in life test failing - //TODO: must investigate - return new JsFunction(context().jsScope()); - } - throw new AssertionError("Unsupported type of functionDeclaration."); + // if (isDeclaration()) { + return context().getFunctionObject(descriptor); +// } +// if (isLiteral()) { +// //TODO: changing this piece of code to more natural "same as for declaration" results in life test failing +// //TODO: must investigate +// return new JsFunction(context().jsScope()); +// } + // throw new AssertionError("Unsupported type of functionDeclaration."); } private void translateBody() { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ArrayForTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ArrayForTranslator.java index 3025f70f041..852a0f6b2c0 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ArrayForTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ArrayForTranslator.java @@ -34,7 +34,6 @@ import java.util.List; import static org.jetbrains.k2js.translate.expression.foreach.ForTranslatorUtils.temporariesInitialization; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getClassDescriptorForType; import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; -import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopBody; import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopRange; /** @@ -43,8 +42,8 @@ import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopRange; public final class ArrayForTranslator extends ForTranslator { @NotNull - public static JsStatement translate(@NotNull JetForExpression expression, - @NotNull TranslationContext context) { + public static JsStatement doTranslate(@NotNull JetForExpression expression, + @NotNull TranslationContext context) { return (new ArrayForTranslator(expression, context).translate()); } @@ -90,7 +89,7 @@ public final class ArrayForTranslator extends ForTranslator { private JsStatement getBody() { JsArrayAccess arrayAccess = new JsArrayAccess(loopRange.reference(), index.reference()); JsStatement currentVar = newVar(parameterName, arrayAccess); - JsStatement realBody = Translation.translateAsStatement(getLoopBody(expression), context()); + JsStatement realBody = translateOriginalBodyExpression(); return AstUtil.newBlock(currentVar, realBody); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ForTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ForTranslator.java index 776d8d578e8..831769a86d1 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ForTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/ForTranslator.java @@ -39,15 +39,15 @@ public abstract class ForTranslator extends AbstractTranslator { public static JsStatement translate(@NotNull JetForExpression expression, @NotNull TranslationContext context) { if (RangeLiteralForTranslator.isApplicable(expression, context)) { - return RangeLiteralForTranslator.translate(expression, context); + return RangeLiteralForTranslator.doTranslate(expression, context); } if (RangeForTranslator.isApplicable(expression, context)) { - return RangeForTranslator.translate(expression, context); + return RangeForTranslator.doTranslate(expression, context); } if (ArrayForTranslator.isApplicable(expression, context)) { - return ArrayForTranslator.translate(expression, context); + return ArrayForTranslator.doTranslate(expression, context); } - return IteratorForTranslator.translate(expression, context); + return IteratorForTranslator.doTranslate(expression, context); } @NotNull @@ -67,7 +67,6 @@ public abstract class ForTranslator extends AbstractTranslator { return context().getNameForElement(loopParameter); } - //TODO: look for should-be-usages @NotNull protected JsStatement translateOriginalBodyExpression() { return Translation.translateAsStatement(getLoopBody(expression), context()); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/IteratorForTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/IteratorForTranslator.java index 8b537937218..b088e0114f7 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/IteratorForTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/IteratorForTranslator.java @@ -41,8 +41,8 @@ import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopRange; public final class IteratorForTranslator extends ForTranslator { @NotNull - public static JsStatement translate(@NotNull JetForExpression expression, - @NotNull TranslationContext context) { + public static JsStatement doTranslate(@NotNull JetForExpression expression, + @NotNull TranslationContext context) { return (new IteratorForTranslator(expression, context).translate()); } @@ -61,6 +61,7 @@ public final class IteratorForTranslator extends ForTranslator { return AstUtil.newBlock(iterator.assignmentExpression().makeStmt(), cycle); } + //TODO: check whether complex logic with blocks is needed @NotNull private JsBlock generateCycleBody() { JsBlock cycleBody = new JsBlock(); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeForTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeForTranslator.java index e8501e036ee..61fe45ca94f 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeForTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeForTranslator.java @@ -32,7 +32,6 @@ import java.util.List; import static org.jetbrains.k2js.translate.expression.foreach.ForTranslatorUtils.temporariesInitialization; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getClassDescriptorForType; import static org.jetbrains.k2js.translate.utils.JsAstUtils.*; -import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopBody; import static org.jetbrains.k2js.translate.utils.PsiUtils.getLoopRange; /** @@ -42,8 +41,8 @@ public final class RangeForTranslator extends ForTranslator { //TODO: inspection @NotNull - public static JsStatement translate(@NotNull JetForExpression expression, - @NotNull TranslationContext context) { + public static JsStatement doTranslate(@NotNull JetForExpression expression, + @NotNull TranslationContext context) { return (new RangeForTranslator(expression, context).translate()); } @@ -52,6 +51,7 @@ public final class RangeForTranslator extends ForTranslator { JetExpression loopRange = getLoopRange(expression); JetType rangeType = BindingUtils.getTypeForExpression(context.bindingContext(), loopRange); //TODO: better check + //TODO: long range? return getClassDescriptorForType(rangeType).getName().equals("IntRange"); } @@ -89,7 +89,7 @@ public final class RangeForTranslator extends ForTranslator { result.setInitVars(initExpression()); result.setCondition(getCondition()); result.setIncrExpr(getIncrExpression()); - result.setBody(Translation.translateAsStatement(getLoopBody(expression), context())); + result.setBody(translateOriginalBodyExpression()); return result; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeLiteralForTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeLiteralForTranslator.java index 1952f489b49..a97943041e9 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeLiteralForTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/foreach/RangeLiteralForTranslator.java @@ -41,8 +41,8 @@ import static org.jetbrains.k2js.translate.utils.TranslationUtils.translateRight public final class RangeLiteralForTranslator extends ForTranslator { @NotNull - public static JsStatement translate(@NotNull JetForExpression expression, - @NotNull TranslationContext context) { + public static JsStatement doTranslate(@NotNull JetForExpression expression, + @NotNull TranslationContext context) { return (new RangeLiteralForTranslator(expression, context).translate()); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java index 2f6e99bbe9b..44ba8651e96 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java @@ -48,8 +48,9 @@ public final class ClassInitializerTranslator extends AbstractInitializerTransla private final List initializerStatements = new ArrayList(); public ClassInitializerTranslator(@NotNull JetClassOrObject classDeclaration, @NotNull TranslationContext context) { - super(context.getScopeForElement(classDeclaration).innerScope - ("initializer " + classDeclaration.getName()), context); + // Note: it's important we use scope for class descriptor because anonymous function used in property initializers + // belong to the properties themselves + super(context.getScopeForDescriptor(getClassDescriptor(context.bindingContext(), classDeclaration)), context); this.classDeclaration = classDeclaration; } @@ -83,6 +84,7 @@ public final class ClassInitializerTranslator extends AbstractInitializerTransla private void addCallToSuperMethod(@NotNull JetDelegatorToSuperCall superCall) { //TODO: look into JsName superMethodName = initializerMethodScope.jsScope().declareName(Namer.superMethodName()); + superMethodName.setObfuscatable(false); List arguments = translateArguments(superCall); initializerStatements.add(convertToStatement(newInvocation(thisQualifiedReference(superMethodName), arguments))); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java index 3e7173779c0..b0732d319f2 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java @@ -32,8 +32,8 @@ public final class NamespaceInitializerTranslator extends AbstractInitializerTra private final NamespaceDescriptor namespace; public NamespaceInitializerTranslator(@NotNull NamespaceDescriptor namespace, @NotNull TranslationContext context) { - super(context.getScopeForDescriptor(namespace).innerScope - ("initializer " + namespace.getName()), context); + //NOTE: + super(context.getScopeForDescriptor(namespace), context); this.namespace = namespace; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java index 522306b1ad0..36d12cc0b05 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.Arrays; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -182,6 +183,23 @@ public final class JsAstUtils { return result; } + public static boolean ownsName(@NotNull JsScope scope, @NotNull JsName name) { + Iterator nameIterator = scope.getAllNames(); + while (nameIterator.hasNext()) { + if (nameIterator.next() == name) { + return true; + } + } + return false; + } + + @NotNull + public static JsObjectLiteral newObjectLiteral(@NotNull List propertyList) { + JsObjectLiteral jsObjectLiteral = new JsObjectLiteral(); + jsObjectLiteral.getPropertyInitializers().addAll(propertyList); + return jsObjectLiteral; + } + public interface Mutator { JsNode mutate(JsNode node); }