TODO fixes

Analyzer -> Analyzer Facade
Refactor for translators.
Fix a bug with scopes.
This commit is contained in:
pTalanov
2012-02-28 21:17:43 +04:00
parent c6a90d79d3
commit 4945f8c9f5
16 changed files with 68 additions and 68 deletions
@@ -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<JetFile> 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 {
@@ -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<JetFile> 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));
}
@@ -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<JsName> nameIterator = scope.getAllNames();
while (nameIterator.hasNext()) {
if (nameIterator.next() == name) {
return true;
}
}
return false;
}
@NotNull
public JsName declareTemporary() {
@@ -323,6 +323,7 @@ public final class StaticContext {
}
}
@NotNull
private NamingScope getEnclosingScope(@NotNull DeclarationDescriptor descriptor) {
DeclarationDescriptor containingDeclaration = getContainingDeclaration(descriptor);
return getScopeForDescriptor(containingDeclaration.getOriginal());
@@ -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
@@ -100,7 +100,7 @@ public final class NamespaceDeclarationTranslator extends AbstractTranslator {
}
@NotNull
private List<JsStatement> declarationStatements(@NotNull List<NamespaceTranslator> namespaceTranslators) {
private static List<JsStatement> declarationStatements(@NotNull List<NamespaceTranslator> namespaceTranslators) {
List<JsStatement> result = Lists.newArrayList();
for (NamespaceTranslator translator : namespaceTranslators) {
result.add(translator.getDeclarationStatement());
@@ -109,7 +109,7 @@ public final class NamespaceDeclarationTranslator extends AbstractTranslator {
}
@NotNull
private List<JsStatement> initializeStatements(@NotNull List<NamespaceTranslator> namespaceTranslators) {
private static List<JsStatement> initializeStatements(@NotNull List<NamespaceTranslator> namespaceTranslators) {
List<JsStatement> result = Lists.newArrayList();
for (NamespaceTranslator translator : namespaceTranslators) {
result.add(translator.getInitializeStatement());
@@ -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<JsPropertyInitializer> propertyList = new ArrayList<JsPropertyInitializer>();
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);
}
}
@@ -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() {
@@ -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);
}
@@ -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());
@@ -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();
@@ -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;
}
@@ -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());
}
@@ -48,8 +48,9 @@ public final class ClassInitializerTranslator extends AbstractInitializerTransla
private final List<JsStatement> initializerStatements = new ArrayList<JsStatement>();
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<JsExpression> arguments = translateArguments(superCall);
initializerStatements.add(convertToStatement(newInvocation(thisQualifiedReference(superMethodName), arguments)));
}
@@ -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;
}
@@ -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<JsName> nameIterator = scope.getAllNames();
while (nameIterator.hasNext()) {
if (nameIterator.next() == name) {
return true;
}
}
return false;
}
@NotNull
public static JsObjectLiteral newObjectLiteral(@NotNull List<JsPropertyInitializer> propertyList) {
JsObjectLiteral jsObjectLiteral = new JsObjectLiteral();
jsObjectLiteral.getPropertyInitializers().addAll(propertyList);
return jsObjectLiteral;
}
public interface Mutator {
JsNode mutate(JsNode node);
}