Compiles a project as a whole
This commit is contained in:
@@ -17,6 +17,9 @@ import org.jetbrains.jet.lang.types.JetStandardLibrary;
|
||||
import org.objectweb.asm.ClassVisitor;
|
||||
import org.objectweb.asm.commons.Method;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class GenerationState {
|
||||
private final ClassFileFactory factory;
|
||||
private final Project project;
|
||||
@@ -85,14 +88,31 @@ public class GenerationState {
|
||||
|
||||
public void compile(JetFile psiFile) {
|
||||
final JetNamespace namespace = psiFile.getRootNamespace();
|
||||
NamespaceCodegen codegen = forNamespace(namespace);
|
||||
final BindingContext bindingContext = AnalyzingUtils.getInstance(JavaDefaultImports.JAVA_DEFAULT_IMPORTS).analyzeNamespace(namespace, JetControlFlowDataTraceFactory.EMPTY);
|
||||
bindingContexts.push(bindingContext);
|
||||
typeMapper = new JetTypeMapper(standardLibrary, bindingContext);
|
||||
try {
|
||||
AnalyzingUtils.throwExceptionOnErrors(bindingContext);
|
||||
AnalyzingUtils.throwExceptionOnErrors(bindingContext);
|
||||
compileCorrectNamespaces(bindingContext, Collections.singletonList(namespace));
|
||||
// NamespaceCodegen codegen = forNamespace(namespace);
|
||||
// bindingContexts.push(bindingContext);
|
||||
// typeMapper = new JetTypeMapper(standardLibrary, bindingContext);
|
||||
// try {
|
||||
// AnalyzingUtils.throwExceptionOnErrors(bindingContext);
|
||||
//
|
||||
// codegen.generate(namespace);
|
||||
// }
|
||||
// finally {
|
||||
// bindingContexts.pop();
|
||||
// typeMapper = null;
|
||||
// }
|
||||
}
|
||||
|
||||
codegen.generate(namespace);
|
||||
public void compileCorrectNamespaces(BindingContext bindingContext, List<JetNamespace> namespaces) {
|
||||
typeMapper = new JetTypeMapper(standardLibrary, bindingContext);
|
||||
bindingContexts.push(bindingContext);
|
||||
try {
|
||||
for (JetNamespace namespace : namespaces) {
|
||||
NamespaceCodegen codegen = forNamespace(namespace);
|
||||
codegen.generate(namespace);
|
||||
}
|
||||
}
|
||||
finally {
|
||||
bindingContexts.pop();
|
||||
|
||||
@@ -23,6 +23,7 @@ import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
|
||||
import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
//import org.jetbrains.jet.lang.resolve.java.JavaPackageScope;
|
||||
//import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
|
||||
@@ -66,7 +67,12 @@ public class AnalyzingUtils {
|
||||
|
||||
public BindingContext analyzeNamespace(@NotNull JetNamespace namespace, @NotNull JetControlFlowDataTraceFactory flowDataTraceFactory) {
|
||||
Project project = namespace.getProject();
|
||||
List<JetDeclaration> declarations = Collections.<JetDeclaration>singletonList(namespace);
|
||||
|
||||
return analyzeNamespaces(project, declarations, flowDataTraceFactory);
|
||||
}
|
||||
|
||||
public BindingContext analyzeNamespaces(@NotNull Project project, @NotNull List<? extends JetDeclaration> declarations, @NotNull JetControlFlowDataTraceFactory flowDataTraceFactory) {
|
||||
BindingTraceContext bindingTraceContext = new BindingTraceContext();
|
||||
JetSemanticServices semanticServices = JetSemanticServices.createSemanticServices(project, flowDataTraceFactory);
|
||||
|
||||
@@ -105,7 +111,7 @@ public class AnalyzingUtils {
|
||||
public ClassObjectStatus setClassObjectDescriptor(@NotNull MutableClassDescriptor classObjectDescriptor) {
|
||||
throw new IllegalStateException("Must be guaranteed not to happen by the parser");
|
||||
}
|
||||
}, Collections.<JetDeclaration>singletonList(namespace));
|
||||
}, declarations);
|
||||
return bindingTraceContext.getBindingContext();
|
||||
}
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ public class TopDownAnalyzer {
|
||||
public static void process(
|
||||
@NotNull JetSemanticServices semanticServices,
|
||||
@NotNull BindingTrace trace,
|
||||
@NotNull JetScope outerScope, NamespaceLike owner, @NotNull List<JetDeclaration> declarations) {
|
||||
@NotNull JetScope outerScope, NamespaceLike owner, @NotNull List<? extends JetDeclaration> declarations) {
|
||||
TopDownAnalysisContext context = new TopDownAnalysisContext(semanticServices, trace);
|
||||
new TypeHierarchyResolver(context).process(outerScope, owner, declarations);
|
||||
new DeclarationResolver(context).process();
|
||||
|
||||
@@ -37,7 +37,7 @@ public class TypeHierarchyResolver {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
public void process(@NotNull JetScope outerScope, NamespaceLike owner, @NotNull List<JetDeclaration> declarations) {
|
||||
public void process(@NotNull JetScope outerScope, NamespaceLike owner, @NotNull List<? extends JetDeclaration> declarations) {
|
||||
collectNamespacesAndClassifiers(outerScope, owner, declarations); // namespaceScopes, classes
|
||||
|
||||
createTypeConstructors(); // create type constructors for classes and generic parameters, supertypes are not filled in
|
||||
@@ -62,7 +62,7 @@ public class TypeHierarchyResolver {
|
||||
private void collectNamespacesAndClassifiers(
|
||||
@NotNull final JetScope outerScope,
|
||||
@NotNull final NamespaceLike owner,
|
||||
@NotNull Collection<JetDeclaration> declarations) {
|
||||
@NotNull Collection<? extends JetDeclaration> declarations) {
|
||||
for (JetDeclaration declaration : declarations) {
|
||||
declaration.accept(new JetVisitorVoid() {
|
||||
@Override
|
||||
|
||||
@@ -48,8 +48,12 @@ public class CallResolver {
|
||||
@NotNull ReceiverDescriptor receiver,
|
||||
@NotNull final JetSimpleNameExpression nameExpression,
|
||||
@NotNull JetType expectedType) {
|
||||
String referencedName = nameExpression.getReferencedName();
|
||||
if (referencedName == null) {
|
||||
return null;
|
||||
}
|
||||
Call call = CallMaker.makePropertyCall(nameExpression);
|
||||
List<ResolutionTask<VariableDescriptor>> prioritizedTasks = PROPERTY_TASK_PRIORITIZER.computePrioritizedTasks(scope, receiver, call, nameExpression.getReferencedName());
|
||||
List<ResolutionTask<VariableDescriptor>> prioritizedTasks = PROPERTY_TASK_PRIORITIZER.computePrioritizedTasks(scope, receiver, call, referencedName);
|
||||
return resolveCallToDescriptor(trace, scope, call, nameExpression.getNode(), expectedType, prioritizedTasks, nameExpression);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user