diff --git a/.idea/inspectionProfiles/idea_default.xml b/.idea/inspectionProfiles/idea_default.xml
index 23bae163cd7..6c2f8ad45ac 100644
--- a/.idea/inspectionProfiles/idea_default.xml
+++ b/.idea/inspectionProfiles/idea_default.xml
@@ -410,6 +410,9 @@
+
diff --git a/.idea/runConfigurations/Js_backend_tests.xml b/.idea/runConfigurations/Js_backend_tests.xml
index f743bf7dde6..95f27eae686 100644
--- a/.idea/runConfigurations/Js_backend_tests.xml
+++ b/.idea/runConfigurations/Js_backend_tests.xml
@@ -26,8 +26,6 @@
-
-
-
+
\ No newline at end of file
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
index 18edab436a2..5ae0c455cbf 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
@@ -198,7 +198,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
private Type generateBody(FunctionDescriptor funDescriptor, ClassBuilder cv, JetDeclarationWithBody body) {
ClassDescriptor function = state.getInjector().getJetTypeMapper().getClosureAnnotator().classDescriptorForFunctionDescriptor(funDescriptor, name);
- final CodegenContext.ClosureContext closureContext = context.intoClosure(
+ final CodegenContexts.ClosureContext closureContext = context.intoClosure(
funDescriptor, function, name.getInternalName(), this, state.getInjector().getJetTypeMapper());
FunctionCodegen fc = new FunctionCodegen(closureContext, cv, state);
JvmMethodSignature jvmMethodSignature = invokeSignature(funDescriptor);
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java
index d387a0f20b4..11969ba40d7 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java
@@ -35,25 +35,6 @@ import java.util.LinkedHashMap;
* @author alex.tkachman
*/
public abstract class CodegenContext {
- public static final CodegenContext STATIC = new CodegenContext(null, OwnerKind.NAMESPACE, null, null) {
- @Override
- protected ClassDescriptor getThisDescriptor() {
- return null;
- }
-
- @Override
- public boolean isStatic() {
- return true;
- }
-
- @Override
- public String toString() {
- return "ROOT";
- }
- };
-
- protected static final StackValue local0 = StackValue.local(0, JetTypeMapper.TYPE_OBJECT);
- protected static final StackValue local1 = StackValue.local(1, JetTypeMapper.TYPE_OBJECT);
private final DeclarationDescriptor contextType;
@@ -121,31 +102,31 @@ public abstract class CodegenContext {
}
public CodegenContext intoNamespace(NamespaceDescriptor descriptor) {
- return new NamespaceContext(descriptor, this);
+ return new CodegenContexts.NamespaceContext(descriptor, this);
}
public CodegenContext intoClass(ClassDescriptor descriptor, OwnerKind kind, JetTypeMapper typeMapper) {
- return new ClassContext(descriptor, kind, this, typeMapper);
+ return new CodegenContexts.ClassContext(descriptor, kind, this, typeMapper);
}
public CodegenContext intoAnonymousClass(@NotNull ObjectOrClosureCodegen closure, ClassDescriptor descriptor, OwnerKind kind, JetTypeMapper typeMapper) {
- return new AnonymousClassContext(descriptor, kind, this, closure, typeMapper);
+ return new CodegenContexts.AnonymousClassContext(descriptor, kind, this, closure, typeMapper);
}
- public MethodContext intoFunction(FunctionDescriptor descriptor) {
- return new MethodContext(descriptor, getContextKind(), this);
+ public CodegenContexts.MethodContext intoFunction(FunctionDescriptor descriptor) {
+ return new CodegenContexts.MethodContext(descriptor, getContextKind(), this);
}
- public ConstructorContext intoConstructor(ConstructorDescriptor descriptor, JetTypeMapper typeMapper) {
+ public CodegenContexts.ConstructorContext intoConstructor(ConstructorDescriptor descriptor, JetTypeMapper typeMapper) {
if(descriptor == null) {
descriptor = new ConstructorDescriptorImpl(getThisDescriptor(), Collections.emptyList(), true)
.initialize(Collections.emptyList(), Collections.emptyList(), Visibilities.PUBLIC);
}
- return new ConstructorContext(descriptor, getContextKind(), this, typeMapper);
+ return new CodegenContexts.ConstructorContext(descriptor, getContextKind(), this, typeMapper);
}
- public ClosureContext intoClosure(FunctionDescriptor funDescriptor, ClassDescriptor classDescriptor, String internalClassName, ClosureCodegen closureCodegen, JetTypeMapper typeMapper) {
- return new ClosureContext(funDescriptor, classDescriptor, this, closureCodegen, internalClassName, typeMapper);
+ public CodegenContexts.ClosureContext intoClosure(FunctionDescriptor funDescriptor, ClassDescriptor classDescriptor, String internalClassName, ClosureCodegen closureCodegen, JetTypeMapper typeMapper) {
+ return new CodegenContexts.ClosureContext(funDescriptor, classDescriptor, this, closureCodegen, internalClassName, typeMapper);
}
public FrameMap prepareFrame(JetTypeMapper mapper) {
@@ -190,7 +171,7 @@ public abstract class CodegenContext {
}
public int getTypeInfoConstantIndex(JetType type) {
- if (parentContext != STATIC) { return parentContext.getTypeInfoConstantIndex(type); }
+ if (parentContext != CodegenContexts.STATIC) { return parentContext.getTypeInfoConstantIndex(type); }
if(typeInfoConstants == null) {
typeInfoConstants = new LinkedHashMap();
@@ -242,7 +223,7 @@ public abstract class CodegenContext {
CallableMemberDescriptor.Kind.DECLARATION
);
JetType receiverType = pd.getReceiverParameter().exists() ? pd.getReceiverParameter().getType() : null;
- myAccessor.setType(pd.getType(), Collections.emptyList(), pd.getExpectedThisObject(), receiverType);
+ myAccessor.setType(pd.getType(), Collections.emptyList(), pd.getExpectedThisObject(), receiverType);
PropertyGetterDescriptor pgd = new PropertyGetterDescriptor(
myAccessor, Collections.emptyList(), myAccessor.getModality(),
@@ -280,174 +261,4 @@ public abstract class CodegenContext {
this.accessors.putAll(accessors);
}
}
-
- public abstract static class ReceiverContext extends CodegenContext {
- final CallableDescriptor receiverDescriptor;
-
- public ReceiverContext(CallableDescriptor contextType, OwnerKind contextKind, CodegenContext parentContext, @Nullable ObjectOrClosureCodegen closureCodegen) {
- super(contextType, contextKind, parentContext, closureCodegen);
- receiverDescriptor = contextType.getReceiverParameter().exists() ? contextType : null;
- }
-
- @Override
- protected CallableDescriptor getReceiverDescriptor() {
- return receiverDescriptor;
- }
- }
-
- public static class MethodContext extends ReceiverContext {
- public MethodContext(FunctionDescriptor contextType, OwnerKind contextKind, CodegenContext parentContext) {
- super(contextType instanceof PropertyAccessorDescriptor ? ((PropertyAccessorDescriptor)contextType).getCorrespondingProperty() : contextType, contextKind, parentContext, null);
- }
-
- @Override
- protected ClassDescriptor getThisDescriptor() {
- return getParentContext().getThisDescriptor();
- }
-
- public StackValue lookupInContext(DeclarationDescriptor d, InstructionAdapter v, StackValue result) {
- return getParentContext().lookupInContext(d, v, result);
- }
-
- public Type enclosingClassType(JetTypeMapper typeMapper) {
- return getParentContext().enclosingClassType(typeMapper);
- }
-
- @Override
- public boolean isStatic() {
- return getParentContext().isStatic();
- }
-
- protected StackValue getOuterExpression(StackValue prefix) {
- return getParentContext().getOuterExpression(prefix);
- }
-
- @Override
- public String toString() {
- return "Method: " + getContextDescriptor();
- }
- }
-
- public static class ConstructorContext extends MethodContext {
- public ConstructorContext(ConstructorDescriptor contextType, OwnerKind kind, CodegenContext parent, JetTypeMapper typeMapper) {
- super(contextType, kind, parent);
-
- final Type type = enclosingClassType(typeMapper);
- outerExpression = type != null
- ? local1
- : null;
- }
-
- protected StackValue getOuterExpression(StackValue prefix) {
- return outerExpression;
- }
-
- @Override
- public String toString() {
- return "Constructor: " + getContextDescriptor().getName();
- }
- }
-
- public static class ClassContext extends CodegenContext {
- public ClassContext(ClassDescriptor contextType, OwnerKind contextKind, CodegenContext parentContext, JetTypeMapper typeMapper) {
- super(contextType, contextKind, parentContext, null);
-
- final Type type = enclosingClassType(typeMapper);
- outerExpression = type != null
- ? StackValue.field(type, typeMapper.getFQName(contextType), "this$0", false)
- : null;
- }
-
- @Override
- protected ClassDescriptor getThisDescriptor() {
- return (ClassDescriptor) getContextDescriptor();
- }
-
- @Override
- public boolean isStatic() {
- return false;
- }
- }
-
- public static class AnonymousClassContext extends CodegenContext {
- public AnonymousClassContext(ClassDescriptor contextType, OwnerKind contextKind, CodegenContext parentContext, @NotNull ObjectOrClosureCodegen closure, JetTypeMapper typeMapper) {
- super(contextType, contextKind, parentContext, closure);
-
- final Type type = enclosingClassType(typeMapper);
- Type owner = closure.state.getInjector().getJetTypeMapper().mapType(contextType.getDefaultType(), MapTypeMode.IMPL);
- outerExpression = type != null
- ? StackValue.field(type, owner.getInternalName(), "this$0", false)
- : null;
- }
-
- @Override
- protected ClassDescriptor getThisDescriptor() {
- return (ClassDescriptor) getContextDescriptor();
- }
-
- @Override
- public boolean isStatic() {
- return false;
- }
-
- @Override
- public String toString() {
- return "Anonymous: " + getThisDescriptor();
- }
- }
-
- public static class ClosureContext extends ReceiverContext {
- private ClassDescriptor classDescriptor;
-
- public ClosureContext(FunctionDescriptor contextType, ClassDescriptor classDescriptor, CodegenContext parentContext, @NotNull ObjectOrClosureCodegen closureCodegen, String internalClassName, JetTypeMapper typeMapper) {
- super(contextType, OwnerKind.IMPLEMENTATION, parentContext, closureCodegen);
- this.classDescriptor = classDescriptor;
-
- final Type type = enclosingClassType(typeMapper);
- outerExpression = type != null
- ? StackValue.field(type, internalClassName, "this$0", false)
- : null;
- }
-
- @Override
- protected ClassDescriptor getThisDescriptor() {
- return classDescriptor;
- }
-
- @Override
- public DeclarationDescriptor getContextDescriptor() {
- return classDescriptor;
- }
-
- @Override
- public boolean isStatic() {
- return false;
- }
-
- @Override
- public String toString() {
- return "Closure: " + classDescriptor;
- }
- }
-
- public static class NamespaceContext extends CodegenContext {
- public NamespaceContext(NamespaceDescriptor contextType, CodegenContext parent) {
- super(contextType, OwnerKind.NAMESPACE, parent, null);
- }
-
- @Override
- protected ClassDescriptor getThisDescriptor() {
- return null;
- }
-
- @Override
- public boolean isStatic() {
- return true;
- }
-
- @Override
- public String toString() {
- return "Namespace: " + getContextDescriptor().getName();
- }
- }
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContexts.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContexts.java
new file mode 100644
index 00000000000..283d26ff222
--- /dev/null
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContexts.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright 2010-2012 JetBrains s.r.o.
+ *
+ * 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 org.jetbrains.jet.codegen;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
+import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
+import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
+import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
+import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
+import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
+import org.jetbrains.jet.lang.descriptors.PropertyAccessorDescriptor;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.InstructionAdapter;
+
+/**
+ * @author Stepan Koltsov
+ */
+public class CodegenContexts {
+ public static final CodegenContext STATIC = new CodegenContext(null, OwnerKind.NAMESPACE, null, null) {
+ @Override
+ protected ClassDescriptor getThisDescriptor() {
+ return null;
+ }
+
+ @Override
+ public boolean isStatic() {
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "ROOT";
+ }
+ };
+ protected static final StackValue local0 = StackValue.local(0, JetTypeMapper.TYPE_OBJECT);
+ protected static final StackValue local1 = StackValue.local(1, JetTypeMapper.TYPE_OBJECT);
+
+ public abstract static class ReceiverContext extends CodegenContext {
+ final CallableDescriptor receiverDescriptor;
+
+ public ReceiverContext(CallableDescriptor contextType, OwnerKind contextKind, CodegenContext parentContext, @Nullable ObjectOrClosureCodegen closureCodegen) {
+ super(contextType, contextKind, parentContext, closureCodegen);
+ receiverDescriptor = contextType.getReceiverParameter().exists() ? contextType : null;
+ }
+
+ @Override
+ protected CallableDescriptor getReceiverDescriptor() {
+ return receiverDescriptor;
+ }
+ }
+
+ public static class MethodContext extends ReceiverContext {
+ public MethodContext(FunctionDescriptor contextType, OwnerKind contextKind, CodegenContext parentContext) {
+ super(contextType instanceof PropertyAccessorDescriptor ? ((PropertyAccessorDescriptor)contextType).getCorrespondingProperty() : contextType, contextKind, parentContext, null);
+ }
+
+ @Override
+ protected ClassDescriptor getThisDescriptor() {
+ return getParentContext().getThisDescriptor();
+ }
+
+ public StackValue lookupInContext(DeclarationDescriptor d, InstructionAdapter v, StackValue result) {
+ return getParentContext().lookupInContext(d, v, result);
+ }
+
+ public Type enclosingClassType(JetTypeMapper typeMapper) {
+ return getParentContext().enclosingClassType(typeMapper);
+ }
+
+ @Override
+ public boolean isStatic() {
+ return getParentContext().isStatic();
+ }
+
+ protected StackValue getOuterExpression(StackValue prefix) {
+ return getParentContext().getOuterExpression(prefix);
+ }
+
+ @Override
+ public String toString() {
+ return "Method: " + getContextDescriptor();
+ }
+ }
+
+ public static class ConstructorContext extends MethodContext {
+ public ConstructorContext(ConstructorDescriptor contextType, OwnerKind kind, CodegenContext parent, JetTypeMapper typeMapper) {
+ super(contextType, kind, parent);
+
+ final Type type = enclosingClassType(typeMapper);
+ outerExpression = type != null
+ ? local1
+ : null;
+ }
+
+ protected StackValue getOuterExpression(StackValue prefix) {
+ return outerExpression;
+ }
+
+ @Override
+ public String toString() {
+ return "Constructor: " + getContextDescriptor().getName();
+ }
+ }
+
+ public static class ClassContext extends CodegenContext {
+ public ClassContext(ClassDescriptor contextType, OwnerKind contextKind, CodegenContext parentContext, JetTypeMapper typeMapper) {
+ super(contextType, contextKind, parentContext, null);
+
+ final Type type = enclosingClassType(typeMapper);
+ outerExpression = type != null
+ ? StackValue.field(type, typeMapper.getFQName(contextType), "this$0", false)
+ : null;
+ }
+
+ @Override
+ protected ClassDescriptor getThisDescriptor() {
+ return (ClassDescriptor) getContextDescriptor();
+ }
+
+ @Override
+ public boolean isStatic() {
+ return false;
+ }
+ }
+
+ public static class AnonymousClassContext extends CodegenContext {
+ public AnonymousClassContext(ClassDescriptor contextType, OwnerKind contextKind, CodegenContext parentContext, @NotNull ObjectOrClosureCodegen closure, JetTypeMapper typeMapper) {
+ super(contextType, contextKind, parentContext, closure);
+
+ final Type type = enclosingClassType(typeMapper);
+ Type owner = closure.state.getInjector().getJetTypeMapper().mapType(contextType.getDefaultType(), MapTypeMode.IMPL);
+ outerExpression = type != null
+ ? StackValue.field(type, owner.getInternalName(), "this$0", false)
+ : null;
+ }
+
+ @Override
+ protected ClassDescriptor getThisDescriptor() {
+ return (ClassDescriptor) getContextDescriptor();
+ }
+
+ @Override
+ public boolean isStatic() {
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return "Anonymous: " + getThisDescriptor();
+ }
+ }
+
+ public static class ClosureContext extends ReceiverContext {
+ private ClassDescriptor classDescriptor;
+
+ public ClosureContext(FunctionDescriptor contextType, ClassDescriptor classDescriptor, CodegenContext parentContext, @NotNull ObjectOrClosureCodegen closureCodegen, String internalClassName, JetTypeMapper typeMapper) {
+ super(contextType, OwnerKind.IMPLEMENTATION, parentContext, closureCodegen);
+ this.classDescriptor = classDescriptor;
+
+ final Type type = enclosingClassType(typeMapper);
+ outerExpression = type != null
+ ? StackValue.field(type, internalClassName, "this$0", false)
+ : null;
+ }
+
+ @Override
+ protected ClassDescriptor getThisDescriptor() {
+ return classDescriptor;
+ }
+
+ @Override
+ public DeclarationDescriptor getContextDescriptor() {
+ return classDescriptor;
+ }
+
+ @Override
+ public boolean isStatic() {
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return "Closure: " + classDescriptor;
+ }
+ }
+
+ public static class NamespaceContext extends CodegenContext {
+ public NamespaceContext(NamespaceDescriptor contextType, CodegenContext parent) {
+ super(contextType, OwnerKind.NAMESPACE, parent, null);
+ }
+
+ @Override
+ protected ClassDescriptor getThisDescriptor() {
+ return null;
+ }
+
+ @Override
+ public boolean isStatic() {
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "Namespace: " + getContextDescriptor().getName();
+ }
+ }
+}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java
index caaf653c39b..be95711e65a 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java
@@ -54,7 +54,7 @@ public class CodegenUtil {
invokeDescriptor.initialize(fd.getReceiverParameter().exists() ? fd.getReceiverParameter().getType() : null,
fd.getExpectedThisObject(),
- Collections.emptyList(),
+ Collections.emptyList(),
fd.getValueParameters(),
fd.getReturnType(),
Modality.FINAL,
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
index fb370463936..9890c1183de 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
@@ -1093,7 +1093,7 @@ public class ExpressionCodegen extends JetVisitor {
}
}
- if (descriptor instanceof TypeParameterDescriptor) {
+ if (descriptor instanceof TypeParameterDescriptorImpl) {
TypeParameterDescriptor typeParameterDescriptor = (TypeParameterDescriptor) descriptor;
v.invokevirtual("jet/TypeInfo", "getClassObject", "()Ljava/lang/Object;");
v.checkcast(asmType(typeParameterDescriptor.getClassObjectType()));
@@ -1162,7 +1162,7 @@ public class ExpressionCodegen extends JetVisitor {
boolean isStatic = containingDeclaration instanceof NamespaceDescriptor;
propertyDescriptor = propertyDescriptor.getOriginal();
boolean isInsideClass = ((containingDeclaration == context.getThisDescriptor()) ||
- (context.getParentContext() instanceof CodegenContext.NamespaceContext) && context.getParentContext().getContextDescriptor() == containingDeclaration)
+ (context.getParentContext() instanceof CodegenContexts.NamespaceContext) && context.getParentContext().getContextDescriptor() == containingDeclaration)
&& contextKind() != OwnerKind.TRAIT_IMPL;
Method getter;
Method setter;
@@ -1438,8 +1438,8 @@ public class ExpressionCodegen extends JetVisitor {
}
private StackValue generateReceiver(DeclarationDescriptor provided) {
- assert context instanceof CodegenContext.ReceiverContext;
- CodegenContext.ReceiverContext cur = (CodegenContext.ReceiverContext) context;
+ assert context instanceof CodegenContexts.ReceiverContext;
+ CodegenContexts.ReceiverContext cur = (CodegenContexts.ReceiverContext) context;
if (cur.getReceiverDescriptor() == provided) {
StackValue result = cur.getReceiverExpression(typeMapper);
return castToRequiredTypeOfInterfaceIfNeeded(result, provided, null);
@@ -1458,7 +1458,7 @@ public class ExpressionCodegen extends JetVisitor {
cur = context;
StackValue result = StackValue.local(0, TYPE_OBJECT);
while (cur != null) {
- if(cur instanceof CodegenContext.MethodContext && !(cur instanceof CodegenContext.ConstructorContext))
+ if(cur instanceof CodegenContexts.MethodContext && !(cur instanceof CodegenContexts.ConstructorContext))
cur = cur.getParentContext();
if (DescriptorUtils.isSubclass(cur.getThisDescriptor(), calleeContainingClass)) {
@@ -1474,7 +1474,7 @@ public class ExpressionCodegen extends JetVisitor {
result = cur.getOuterExpression(result);
- if(cur instanceof CodegenContext.ConstructorContext) {
+ if(cur instanceof CodegenContexts.ConstructorContext) {
cur = cur.getParentContext();
}
cur = cur.getParentContext();
@@ -2614,7 +2614,7 @@ If finally block is present, its last expression is the value of try expression.
JetExpression left = expression.getLeft();
JetType leftType = bindingContext.get(BindingContext.EXPRESSION_TYPE, left);
DeclarationDescriptor descriptor = rightType.getConstructor().getDeclarationDescriptor();
- if (descriptor instanceof ClassDescriptor || descriptor instanceof TypeParameterDescriptor) {
+ if (descriptor instanceof ClassDescriptor || descriptor instanceof TypeParameterDescriptorImpl) {
StackValue value = genQualified(receiver, left);
value.put(JetTypeMapper.boxType(value.type), v);
assert leftType != null;
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java
index 4a3d6788223..287328ea27a 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java
@@ -69,7 +69,7 @@ public class FunctionCodegen {
JvmMethodSignature jvmMethod, boolean needJetAnnotations,
@Nullable String propertyTypeSignature, FunctionDescriptor functionDescriptor) {
- CodegenContext.MethodContext funContext = owner.intoFunction(functionDescriptor);
+ CodegenContexts.MethodContext funContext = owner.intoFunction(functionDescriptor);
final JetExpression bodyExpression = f.getBodyExpression();
generatedMethod(bodyExpression, jvmMethod, needJetAnnotations, propertyTypeSignature, funContext, functionDescriptor, f);
@@ -78,7 +78,7 @@ public class FunctionCodegen {
private void generatedMethod(JetExpression bodyExpressions,
JvmMethodSignature jvmSignature,
boolean needJetAnnotations, @Nullable String propertyTypeSignature,
- CodegenContext.MethodContext context,
+ CodegenContexts.MethodContext context,
FunctionDescriptor functionDescriptor,
JetDeclarationWithBody fun
)
@@ -301,7 +301,7 @@ public class FunctionCodegen {
}
}
- static void generateDefaultIfNeeded(CodegenContext.MethodContext owner, GenerationState state, ClassBuilder v, Method jvmSignature, @Nullable FunctionDescriptor functionDescriptor, OwnerKind kind) {
+ static void generateDefaultIfNeeded(CodegenContexts.MethodContext owner, GenerationState state, ClassBuilder v, Method jvmSignature, @Nullable FunctionDescriptor functionDescriptor, OwnerKind kind) {
DeclarationDescriptor contextClass = owner.getContextDescriptor().getContainingDeclaration();
if(kind != OwnerKind.TRAIT_IMPL) {
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java
index 9d0452be3f3..3d90db50b95 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java
@@ -449,7 +449,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
ConstructorDescriptor constructorDescriptor = bindingContext.get(BindingContext.CONSTRUCTOR, myClass);
- CodegenContext.ConstructorContext constructorContext = context.intoConstructor(constructorDescriptor, typeMapper);
+ CodegenContexts.ConstructorContext constructorContext = context.intoConstructor(constructorDescriptor, typeMapper);
JvmMethodSignature constructorMethod;
CallableMethod callableMethod;
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java
index d1b3807da64..71bc4f14ec5 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java
@@ -463,7 +463,7 @@ public class JetTypeMapper {
return asmType;
}
- if (descriptor instanceof TypeParameterDescriptor) {
+ if (descriptor instanceof TypeParameterDescriptorImpl) {
Type type = mapType(((TypeParameterDescriptor) descriptor).getUpperBoundsAsType(), kind);
if (signatureVisitor != null) {
@@ -722,7 +722,7 @@ public class JetTypeMapper {
signatureVisitor.writeInterfaceBoundEnd();
}
}
- if (jetType.getConstructor().getDeclarationDescriptor() instanceof TypeParameterDescriptor) {
+ if (jetType.getConstructor().getDeclarationDescriptor() instanceof TypeParameterDescriptorImpl) {
signatureVisitor.writeInterfaceBound();
mapType(jetType, signatureVisitor, MapTypeMode.TYPE_PARAMETER);
signatureVisitor.writeInterfaceBoundEnd();
@@ -966,7 +966,7 @@ public class JetTypeMapper {
public boolean isGenericsArray(JetType type) {
DeclarationDescriptor declarationDescriptor = type.getConstructor().getDeclarationDescriptor();
- if(declarationDescriptor instanceof TypeParameterDescriptor)
+ if(declarationDescriptor instanceof TypeParameterDescriptorImpl)
return true;
if(standardLibrary.getArray().equals(declarationDescriptor))
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java
index fe0faeec34e..53348ac9506 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java
@@ -23,7 +23,6 @@ import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.name.FqName;
-import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.objectweb.asm.MethodVisitor;
@@ -57,7 +56,7 @@ public class NamespaceCodegen {
public void generate(JetFile file) {
NamespaceDescriptor descriptor = state.getBindingContext().get(BindingContext.FILE_TO_NAMESPACE, file);
- final CodegenContext context = CodegenContext.STATIC.intoNamespace(descriptor);
+ final CodegenContext context = CodegenContexts.STATIC.intoNamespace(descriptor);
final FunctionCodegen functionCodegen = new FunctionCodegen(context, v, state);
final PropertyCodegen propertyCodegen = new PropertyCodegen(context, v, functionCodegen, state);
@@ -100,7 +99,7 @@ public class NamespaceCodegen {
mv.visitCode();
FrameMap frameMap = new FrameMap();
- ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, CodegenContext.STATIC, state);
+ ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, CodegenContexts.STATIC, state);
for (JetDeclaration declaration : namespace.getDeclarations()) {
if (declaration instanceof JetProperty) {
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java
index a670be29554..e0666f20af1 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java
@@ -106,9 +106,9 @@ public class ObjectOrClosureCodegen {
FunctionDescriptor fd = (FunctionDescriptor) d;
// we generate method
- assert context instanceof CodegenContext.ReceiverContext;
+ assert context instanceof CodegenContexts.ReceiverContext;
- CodegenContext.ReceiverContext fcontext = (CodegenContext.ReceiverContext) context;
+ CodegenContexts.ReceiverContext fcontext = (CodegenContexts.ReceiverContext) context;
if(fcontext.getReceiverDescriptor() != fd)
return null;
diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java
index 433574fa0ac..f5077050bb4 100644
--- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java
+++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java
@@ -34,7 +34,6 @@ import org.jetbrains.jet.codegen.*;
import org.jetbrains.jet.cli.common.messages.AnalyzerWithCompilerReport;
import org.jetbrains.jet.cli.common.messages.CompilerMessageLocation;
import org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity;
-import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -246,7 +245,6 @@ public class KotlinToJVMBytecodeCompiler {
public AnalyzeExhaust invoke() {
return AnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
environment.getProject(), environment.getSourceFiles(), filesToAnalyzeCompletely,
- JetControlFlowDataTraceFactory.EMPTY,
configuration.getEnvironment().getCompilerDependencies());
}
}, environment.getSourceFiles()
diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java
index 5f98e0cdbbe..fa918fa82e8 100644
--- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java
+++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java
@@ -17,16 +17,42 @@
package org.jetbrains.jet.di;
+import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
+import org.jetbrains.jet.lang.resolve.TopDownAnalysisContext;
+import org.jetbrains.jet.lang.resolve.BodyResolver;
+import org.jetbrains.jet.lang.resolve.ControlFlowAnalyzer;
+import org.jetbrains.jet.lang.resolve.DeclarationsChecker;
+import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import com.intellij.openapi.project.Project;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
+import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
+import org.jetbrains.jet.lang.resolve.ObservableBindingTrace;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
-import org.jetbrains.jet.lang.resolve.*;
+import org.jetbrains.jet.lang.resolve.java.CompilerDependencies;
+import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
+import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration;
+import org.jetbrains.jet.lang.resolve.java.PsiClassFinderForJvm;
+import org.jetbrains.jet.lang.resolve.DeclarationResolver;
+import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
-import org.jetbrains.jet.lang.resolve.calls.OverloadingConflictResolver;
-import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
-
+import org.jetbrains.jet.lang.resolve.TypeResolver;
+import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
+import org.jetbrains.jet.lang.resolve.calls.OverloadingConflictResolver;
+import org.jetbrains.jet.lang.resolve.ImportsResolver;
+import org.jetbrains.jet.lang.resolve.DelegationResolver;
+import org.jetbrains.jet.lang.resolve.NamespaceFactoryImpl;
+import org.jetbrains.jet.lang.resolve.OverloadResolver;
+import org.jetbrains.jet.lang.resolve.OverrideResolver;
+import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver;
+import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
+import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
+import org.jetbrains.jet.lang.resolve.java.JavaTypeTransformer;
+import com.intellij.openapi.project.Project;
+import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
+import org.jetbrains.jet.lang.resolve.ObservableBindingTrace;
+import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
+import org.jetbrains.jet.lang.resolve.java.CompilerDependencies;
+import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy;
/* This file is generated by org.jetbrains.jet.di.AllInjectorsGenerator. DO NOT EDIT! */
@@ -42,7 +68,6 @@ public class InjectorForTopDownAnalyzerForJvm {
private final TopDownAnalysisParameters topDownAnalysisParameters;
private final ObservableBindingTrace observableBindingTrace;
private final ModuleDescriptor moduleDescriptor;
- private final JetControlFlowDataTraceFactory jetControlFlowDataTraceFactory;
private final CompilerDependencies compilerDependencies;
private CompilerSpecialMode compilerSpecialMode;
private JavaBridgeConfiguration javaBridgeConfiguration;
@@ -69,7 +94,6 @@ public class InjectorForTopDownAnalyzerForJvm {
@NotNull TopDownAnalysisParameters topDownAnalysisParameters,
@NotNull ObservableBindingTrace observableBindingTrace,
@NotNull ModuleDescriptor moduleDescriptor,
- JetControlFlowDataTraceFactory jetControlFlowDataTraceFactory,
@NotNull CompilerDependencies compilerDependencies
) {
this.topDownAnalyzer = new TopDownAnalyzer();
@@ -82,7 +106,6 @@ public class InjectorForTopDownAnalyzerForJvm {
this.topDownAnalysisParameters = topDownAnalysisParameters;
this.observableBindingTrace = observableBindingTrace;
this.moduleDescriptor = moduleDescriptor;
- this.jetControlFlowDataTraceFactory = jetControlFlowDataTraceFactory;
this.compilerDependencies = compilerDependencies;
this.compilerSpecialMode = compilerDependencies.getCompilerSpecialMode();
this.javaBridgeConfiguration = new JavaBridgeConfiguration();
@@ -126,7 +149,6 @@ public class InjectorForTopDownAnalyzerForJvm {
this.bodyResolver.setTopDownAnalysisParameters(topDownAnalysisParameters);
this.bodyResolver.setTrace(observableBindingTrace);
- this.controlFlowAnalyzer.setFlowDataTraceFactory(jetControlFlowDataTraceFactory);
this.controlFlowAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
this.controlFlowAnalyzer.setTrace(observableBindingTrace);
diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java
index 75e2cf1db01..5b14ec0e973 100644
--- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java
+++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java
@@ -24,7 +24,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.analyzer.AnalyzeExhaust;
import org.jetbrains.jet.analyzer.AnalyzerFacade;
import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm;
-import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.*;
@@ -50,9 +49,8 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
@NotNull
public AnalyzeExhaust analyzeFiles(@NotNull Project project,
@NotNull Collection files,
- @NotNull Predicate filesToAnalyzeCompletely,
- @NotNull JetControlFlowDataTraceFactory flowDataTraceFactory) {
- return analyzeFilesWithJavaIntegration(project, files, filesToAnalyzeCompletely, flowDataTraceFactory,
+ @NotNull Predicate filesToAnalyzeCompletely) {
+ return analyzeFilesWithJavaIntegration(project, files, filesToAnalyzeCompletely,
compilerDependenciesForProduction(CompilerSpecialMode.REGULAR), true);
}
@@ -60,22 +58,19 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
@Override
public AnalyzeExhaust analyzeBodiesInFiles(@NotNull Project project,
@NotNull Predicate filesForBodiesResolve,
- @NotNull JetControlFlowDataTraceFactory flowDataTraceFactory,
@NotNull BindingTrace headersTraceContext,
@NotNull BodiesResolveContext bodiesResolveContext
) {
return analyzeBodiesInFilesWithJavaIntegration(
- project, filesForBodiesResolve, flowDataTraceFactory,
- compilerDependenciesForProduction(CompilerSpecialMode.REGULAR),
+ project, filesForBodiesResolve, compilerDependenciesForProduction(CompilerSpecialMode.REGULAR),
headersTraceContext, bodiesResolveContext);
}
public static AnalyzeExhaust analyzeOneFileWithJavaIntegrationAndCheckForErrors(
- JetFile file, JetControlFlowDataTraceFactory flowDataTraceFactory,
- @NotNull CompilerDependencies compilerDependencies) {
+ JetFile file, @NotNull CompilerDependencies compilerDependencies) {
AnalyzingUtils.checkForSyntacticErrors(file);
- AnalyzeExhaust analyzeExhaust = analyzeOneFileWithJavaIntegration(file, flowDataTraceFactory, compilerDependencies);
+ AnalyzeExhaust analyzeExhaust = analyzeOneFileWithJavaIntegration(file, compilerDependencies);
AnalyzingUtils.throwExceptionOnErrors(analyzeExhaust.getBindingContext());
@@ -83,24 +78,20 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
}
public static AnalyzeExhaust analyzeOneFileWithJavaIntegration(
- JetFile file, JetControlFlowDataTraceFactory flowDataTraceFactory,
- @NotNull CompilerDependencies compilerDependencies) {
+ JetFile file, @NotNull CompilerDependencies compilerDependencies) {
return analyzeFilesWithJavaIntegration(file.getProject(), Collections.singleton(file),
- Predicates.alwaysTrue(), flowDataTraceFactory, compilerDependencies);
+ Predicates.alwaysTrue(), compilerDependencies);
}
public static AnalyzeExhaust analyzeFilesWithJavaIntegration(
Project project, Collection files, Predicate filesToAnalyzeCompletely,
- JetControlFlowDataTraceFactory flowDataTraceFactory,
@NotNull CompilerDependencies compilerDependencies) {
return analyzeFilesWithJavaIntegration(
- project, files, filesToAnalyzeCompletely,
- flowDataTraceFactory, compilerDependencies, false);
+ project, files, filesToAnalyzeCompletely, compilerDependencies, false);
}
public static AnalyzeExhaust analyzeFilesWithJavaIntegration(
Project project, Collection files, Predicate filesToAnalyzeCompletely,
- JetControlFlowDataTraceFactory flowDataTraceFactory,
@NotNull CompilerDependencies compilerDependencies,
boolean storeContextForBodiesResolve) {
BindingTraceContext bindingTraceContext = new BindingTraceContext();
@@ -112,8 +103,7 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
InjectorForTopDownAnalyzerForJvm injector = new InjectorForTopDownAnalyzerForJvm(
project, topDownAnalysisParameters,
- new ObservableBindingTrace(bindingTraceContext), owner, flowDataTraceFactory,
- compilerDependencies);
+ new ObservableBindingTrace(bindingTraceContext), owner, compilerDependencies);
try {
injector.getTopDownAnalyzer().analyzeFiles(files);
BodiesResolveContext bodiesResolveContext = storeContextForBodiesResolve ?
@@ -127,7 +117,6 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
public static AnalyzeExhaust analyzeBodiesInFilesWithJavaIntegration(
Project project, Predicate filesToAnalyzeCompletely,
- JetControlFlowDataTraceFactory flowDataTraceFactory,
@NotNull CompilerDependencies compilerDependencies,
@NotNull BindingTrace traceContext,
@NotNull BodiesResolveContext bodiesResolveContext) {
@@ -140,8 +129,7 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
InjectorForTopDownAnalyzerForJvm injector = new InjectorForTopDownAnalyzerForJvm(
project, topDownAnalysisParameters,
- new ObservableBindingTrace(traceContext), owner, flowDataTraceFactory,
- compilerDependencies);
+ new ObservableBindingTrace(traceContext), owner, compilerDependencies);
try {
injector.getTopDownAnalyzer().doProcessForBodies(bodiesResolveContext);
@@ -157,7 +145,6 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
Project project = files.iterator().next().getProject();
- return analyzeFilesWithJavaIntegration(project, files, Predicates.alwaysFalse(),
- JetControlFlowDataTraceFactory.EMPTY, compilerDependencies);
+ return analyzeFilesWithJavaIntegration(project, files, Predicates.alwaysFalse(), compilerDependencies);
}
}
diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java
index e69bf8ee9af..506ce076cac 100644
--- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java
+++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java
@@ -49,7 +49,7 @@ import java.util.*;
/**
* @author abreslav
*/
-public class JavaDescriptorResolver {
+public class JavaDescriptorResolver implements DependencyClassByQualifiedNameResolver {
public static final Name JAVA_ROOT = Name.special("");
@@ -107,14 +107,14 @@ public class JavaDescriptorResolver {
@NotNull
private final TypeParameterDescriptorOrigin origin;
@NotNull
- final TypeParameterDescriptor descriptor;
+ final TypeParameterDescriptorImpl descriptor;
final PsiTypeParameter psiTypeParameter;
@Nullable
private final List upperBoundsForKotlin;
@Nullable
private final List lowerBoundsForKotlin;
- private TypeParameterDescriptorInitialization(@NotNull TypeParameterDescriptor descriptor, @NotNull PsiTypeParameter psiTypeParameter) {
+ private TypeParameterDescriptorInitialization(@NotNull TypeParameterDescriptorImpl descriptor, @NotNull PsiTypeParameter psiTypeParameter) {
this.origin = TypeParameterDescriptorOrigin.JAVA;
this.descriptor = descriptor;
this.psiTypeParameter = psiTypeParameter;
@@ -122,7 +122,7 @@ public class JavaDescriptorResolver {
this.lowerBoundsForKotlin = null;
}
- private TypeParameterDescriptorInitialization(@NotNull TypeParameterDescriptor descriptor, @NotNull PsiTypeParameter psiTypeParameter,
+ private TypeParameterDescriptorInitialization(@NotNull TypeParameterDescriptorImpl descriptor, @NotNull PsiTypeParameter psiTypeParameter,
List upperBoundsForKotlin, List lowerBoundsForKotlin) {
this.origin = TypeParameterDescriptorOrigin.KOTLIN;
this.descriptor = descriptor;
@@ -307,6 +307,11 @@ public class JavaDescriptorResolver {
return clazz;
}
+ @Override
+ public ClassDescriptor resolveClass(@NotNull FqName qualifiedName) {
+ return resolveClass(qualifiedName, DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN);
+ }
+
private ClassDescriptor resolveClass(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule, @NotNull List tasks) {
if (qualifiedName.getFqName().endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
// TODO: only if -$$TImpl class is created by Kotlin
@@ -603,10 +608,10 @@ public class JavaDescriptorResolver {
@NotNull
private final TypeVariableResolver typeVariableResolver;
@NotNull
- private final TypeParameterDescriptor typeParameterDescriptor;
+ private final TypeParameterDescriptorImpl typeParameterDescriptor;
protected JetSignatureTypeParameterVisitor(PsiTypeParameterListOwner psiOwner,
- String name, TypeVariableResolver typeVariableResolver, TypeParameterDescriptor typeParameterDescriptor)
+ String name, TypeVariableResolver typeVariableResolver, TypeParameterDescriptorImpl typeParameterDescriptor)
{
if (name.isEmpty()) {
throw new IllegalStateException();
@@ -682,7 +687,7 @@ public class JavaDescriptorResolver {
@Override
public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
- TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification(
+ TypeParameterDescriptorImpl typeParameter = TypeParameterDescriptorImpl.createForFurtherModification(
containingDeclaration,
Collections.emptyList(), // TODO: wrong
reified,
@@ -757,7 +762,7 @@ public class JavaDescriptorResolver {
@NotNull
private TypeParameterDescriptorInitialization makeUninitializedTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
- TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
+ TypeParameterDescriptorImpl typeParameterDescriptor = TypeParameterDescriptorImpl.createForFurtherModification(
containingDeclaration,
Collections.emptyList(), // TODO
false,
@@ -769,7 +774,7 @@ public class JavaDescriptorResolver {
}
private void initializeTypeParameter(TypeParameterDescriptorInitialization typeParameter, TypeVariableResolver typeVariableByPsiResolver) {
- TypeParameterDescriptor typeParameterDescriptor = typeParameter.descriptor;
+ TypeParameterDescriptorImpl typeParameterDescriptor = typeParameter.descriptor;
if (typeParameter.origin == TypeParameterDescriptorOrigin.KOTLIN) {
List> upperBounds = typeParameter.upperBoundsForKotlin;
if (upperBounds.size() == 0){
@@ -947,6 +952,11 @@ public class JavaDescriptorResolver {
return scopeData.namespaceDescriptor;
}
+ @Override
+ public NamespaceDescriptor resolveNamespace(@NotNull FqName qualifiedName) {
+ return resolveNamespace(qualifiedName, DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN);
+ }
+
private NamespaceDescriptorParent resolveParentNamespace(FqName fqName) {
if (fqName.isRoot()) {
return FAKE_ROOT_MODULE;
diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolverFromTypeDescriptors.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolverFromTypeDescriptors.java
index ed1f6235fff..aedd1e8bef1 100644
--- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolverFromTypeDescriptors.java
+++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolverFromTypeDescriptors.java
@@ -17,7 +17,6 @@
package org.jetbrains.jet.lang.resolve.java;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolvers.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolvers.java
index 3a63089762c..858625e4c93 100644
--- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolvers.java
+++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolvers.java
@@ -17,12 +17,7 @@
package org.jetbrains.jet.lang.resolve.java;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
-import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor;
-import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
-import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
-import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
-import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
+import org.jetbrains.jet.lang.descriptors.*;
import java.util.ArrayList;
import java.util.List;
diff --git a/compiler/frontend/src/org/jetbrains/jet/analyzer/AnalyzerFacade.java b/compiler/frontend/src/org/jetbrains/jet/analyzer/AnalyzerFacade.java
index a80a65f787f..b5fd8f9768a 100644
--- a/compiler/frontend/src/org/jetbrains/jet/analyzer/AnalyzerFacade.java
+++ b/compiler/frontend/src/org/jetbrains/jet/analyzer/AnalyzerFacade.java
@@ -20,7 +20,6 @@ import com.google.common.base.Predicate;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.BodiesResolveContext;
@@ -35,13 +34,11 @@ public interface AnalyzerFacade {
@NotNull
AnalyzeExhaust analyzeFiles(@NotNull Project project,
@NotNull Collection files,
- @NotNull Predicate filesToAnalyzeCompletely,
- @NotNull JetControlFlowDataTraceFactory flowDataTraceFactory);
+ @NotNull Predicate filesToAnalyzeCompletely);
@NotNull
AnalyzeExhaust analyzeBodiesInFiles(@NotNull Project project,
@NotNull Predicate filesForBodiesResolve,
- @NotNull JetControlFlowDataTraceFactory flowDataTraceFactory,
@NotNull BindingTrace traceContext,
@NotNull BodiesResolveContext bodiesResolveContext);
}
diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java
index 843ec10293a..6dda0b5f2e6 100644
--- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java
+++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java
@@ -17,16 +17,36 @@
package org.jetbrains.jet.di;
+import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
+import org.jetbrains.jet.lang.resolve.TopDownAnalysisContext;
+import org.jetbrains.jet.lang.resolve.BodyResolver;
+import org.jetbrains.jet.lang.resolve.ControlFlowAnalyzer;
+import org.jetbrains.jet.lang.resolve.DeclarationsChecker;
+import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import com.intellij.openapi.project.Project;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.jet.lang.ModuleConfiguration;
-import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
+import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
+import org.jetbrains.jet.lang.resolve.ObservableBindingTrace;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
-import org.jetbrains.jet.lang.resolve.*;
+import org.jetbrains.jet.lang.ModuleConfiguration;
+import org.jetbrains.jet.lang.resolve.DeclarationResolver;
+import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
-import org.jetbrains.jet.lang.resolve.calls.OverloadingConflictResolver;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
-
+import org.jetbrains.jet.lang.resolve.TypeResolver;
+import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
+import org.jetbrains.jet.lang.resolve.calls.OverloadingConflictResolver;
+import org.jetbrains.jet.lang.resolve.ImportsResolver;
+import org.jetbrains.jet.lang.resolve.DelegationResolver;
+import org.jetbrains.jet.lang.resolve.NamespaceFactoryImpl;
+import org.jetbrains.jet.lang.resolve.OverloadResolver;
+import org.jetbrains.jet.lang.resolve.OverrideResolver;
+import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver;
+import com.intellij.openapi.project.Project;
+import org.jetbrains.jet.lang.resolve.TopDownAnalysisParameters;
+import org.jetbrains.jet.lang.resolve.ObservableBindingTrace;
+import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
+import org.jetbrains.jet.lang.ModuleConfiguration;
+import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy;
/* This file is generated by org.jetbrains.jet.di.AllInjectorsGenerator. DO NOT EDIT! */
@@ -42,7 +62,6 @@ public class InjectorForTopDownAnalyzerBasic {
private final TopDownAnalysisParameters topDownAnalysisParameters;
private final ObservableBindingTrace observableBindingTrace;
private final ModuleDescriptor moduleDescriptor;
- private final JetControlFlowDataTraceFactory jetControlFlowDataTraceFactory;
private final ModuleConfiguration moduleConfiguration;
private DeclarationResolver declarationResolver;
private AnnotationResolver annotationResolver;
@@ -63,7 +82,6 @@ public class InjectorForTopDownAnalyzerBasic {
@NotNull TopDownAnalysisParameters topDownAnalysisParameters,
@NotNull ObservableBindingTrace observableBindingTrace,
@NotNull ModuleDescriptor moduleDescriptor,
- JetControlFlowDataTraceFactory jetControlFlowDataTraceFactory,
@NotNull ModuleConfiguration moduleConfiguration
) {
this.topDownAnalyzer = new TopDownAnalyzer();
@@ -76,7 +94,6 @@ public class InjectorForTopDownAnalyzerBasic {
this.topDownAnalysisParameters = topDownAnalysisParameters;
this.observableBindingTrace = observableBindingTrace;
this.moduleDescriptor = moduleDescriptor;
- this.jetControlFlowDataTraceFactory = jetControlFlowDataTraceFactory;
this.moduleConfiguration = moduleConfiguration;
this.declarationResolver = new DeclarationResolver();
this.annotationResolver = new AnnotationResolver();
@@ -114,7 +131,6 @@ public class InjectorForTopDownAnalyzerBasic {
this.bodyResolver.setTopDownAnalysisParameters(topDownAnalysisParameters);
this.bodyResolver.setTrace(observableBindingTrace);
- this.controlFlowAnalyzer.setFlowDataTraceFactory(jetControlFlowDataTraceFactory);
this.controlFlowAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
this.controlFlowAnalyzer.setTrace(observableBindingTrace);
diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java
index 18d4ddfd1c1..b1822200b66 100644
--- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java
+++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java
@@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.cfg;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode;
import org.jetbrains.jet.lang.psi.*;
import java.util.List;
@@ -64,7 +65,7 @@ public interface JetControlFlowBuilder {
// Subroutines
void enterSubroutine(@NotNull JetDeclaration subroutine);
- void exitSubroutine(@NotNull JetDeclaration subroutine);
+ Pseudocode exitSubroutine(@NotNull JetDeclaration subroutine);
@NotNull
JetElement getCurrentSubroutine();
diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java
index e3f6d4df970..cb3d67b2b64 100644
--- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java
+++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java
@@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.cfg;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode;
import org.jetbrains.jet.lang.psi.*;
import java.util.List;
@@ -157,9 +158,9 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder {
}
@Override
- public void exitSubroutine(@NotNull JetDeclaration subroutine) {
+ public Pseudocode exitSubroutine(@NotNull JetDeclaration subroutine) {
assert builder != null;
- builder.exitSubroutine(subroutine);
+ return builder.exitSubroutine(subroutine);
}
@NotNull
diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java
deleted file mode 100644
index bf42c3ec570..00000000000
--- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright 2010-2012 JetBrains s.r.o.
- *
- * 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 org.jetbrains.jet.lang.cfg;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import com.intellij.openapi.util.Pair;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.jet.lang.cfg.pseudocode.*;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author svtk
- */
-public class JetControlFlowGraphTraverser {
- private final Pseudocode pseudocode;
- private final boolean lookInside;
- private final boolean straightDirection;
- private final Map> dataMap = Maps.newLinkedHashMap();
-
- public static JetControlFlowGraphTraverser create(@NotNull Pseudocode pseudocode, boolean lookInside, boolean straightDirection) {
- return new JetControlFlowGraphTraverser(pseudocode, lookInside, straightDirection);
- }
-
- private JetControlFlowGraphTraverser(@NotNull Pseudocode pseudocode, boolean lookInside, boolean straightDirection) {
- this.pseudocode = pseudocode;
- this.lookInside = lookInside;
- this.straightDirection = straightDirection;
- }
-
- @NotNull
- private Instruction getStartInstruction(@NotNull Pseudocode pseudocode) {
- return straightDirection ? pseudocode.getEnterInstruction() : pseudocode.getSinkInstruction();
- }
-
- public void collectInformationFromInstructionGraph(
- @NotNull D initialDataValue,
- @NotNull D initialDataValueForEnterInstruction,
- @NotNull InstructionDataMergeStrategy instructionDataMergeStrategy) {
- initializeDataMap(pseudocode, initialDataValue);
- dataMap.put(getStartInstruction(pseudocode),
- Pair.create(initialDataValueForEnterInstruction, initialDataValueForEnterInstruction));
-
- boolean[] changed = new boolean[1];
- changed[0] = true;
- while (changed[0]) {
- changed[0] = false;
- traverseSubGraph(pseudocode, instructionDataMergeStrategy, Collections.emptyList(), changed, false);
- }
- }
-
- private void initializeDataMap(
- @NotNull Pseudocode pseudocode,
- @NotNull D initialDataValue) {
- List instructions = pseudocode.getInstructions();
- Pair initialPair = Pair.create(initialDataValue, initialDataValue);
- for (Instruction instruction : instructions) {
- dataMap.put(instruction, initialPair);
- if (lookInside && instruction instanceof LocalDeclarationInstruction) {
- initializeDataMap(((LocalDeclarationInstruction) instruction).getBody(), initialDataValue);
- }
- }
- }
-
- private void traverseSubGraph(
- @NotNull Pseudocode pseudocode,
- @NotNull InstructionDataMergeStrategy instructionDataMergeStrategy,
- @NotNull Collection previousSubGraphInstructions,
- boolean[] changed,
- boolean isLocal) {
- List instructions = pseudocode.getInstructions();
- Instruction startInstruction = getStartInstruction(pseudocode);
-
- if (!straightDirection) {
- instructions = Lists.newArrayList(instructions);
- Collections.reverse(instructions);
- }
- for (Instruction instruction : instructions) {
- boolean isStart = straightDirection ? instruction instanceof SubroutineEnterInstruction : instruction instanceof SubroutineSinkInstruction;
- if (!isLocal && isStart) continue;
-
- Collection allPreviousInstructions;
- Collection previousInstructions = straightDirection
- ? instruction.getPreviousInstructions()
- : instruction.getNextInstructions();
-
- if (instruction == startInstruction && !previousSubGraphInstructions.isEmpty()) {
- allPreviousInstructions = Lists.newArrayList(previousInstructions);
- allPreviousInstructions.addAll(previousSubGraphInstructions);
- }
- else {
- allPreviousInstructions = previousInstructions;
- }
-
- if (lookInside && instruction instanceof LocalDeclarationInstruction) {
- Pseudocode subroutinePseudocode = ((LocalDeclarationInstruction) instruction).getBody();
- traverseSubGraph(subroutinePseudocode, instructionDataMergeStrategy, previousInstructions, changed, true);
- Instruction lastInstruction = straightDirection ? subroutinePseudocode.getSinkInstruction() : subroutinePseudocode.getEnterInstruction();
- Pair previousValue = dataMap.get(instruction);
- Pair newValue = dataMap.get(lastInstruction);
- if (!previousValue.equals(newValue)) {
- changed[0] = true;
- dataMap.put(instruction, newValue);
- }
- continue;
- }
- Pair previousDataValue = dataMap.get(instruction);
-
- Collection incomingEdgesData = Sets.newHashSet();
-
- for (Instruction previousInstruction : allPreviousInstructions) {
- Pair previousData = dataMap.get(previousInstruction);
- if (previousData != null) {
- incomingEdgesData.add(previousData.getSecond());
- }
- }
- Pair mergedData = instructionDataMergeStrategy.execute(instruction, incomingEdgesData);
- if (!mergedData.equals(previousDataValue)) {
- changed[0] = true;
- dataMap.put(instruction, mergedData);
- }
- }
- }
-
- public void traverseAndAnalyzeInstructionGraph(
- @NotNull InstructionDataAnalyzeStrategy instructionDataAnalyzeStrategy) {
- traverseAndAnalyzeInstructionGraph(pseudocode, instructionDataAnalyzeStrategy);
- }
-
- private void traverseAndAnalyzeInstructionGraph(
- @NotNull Pseudocode pseudocode,
- @NotNull InstructionDataAnalyzeStrategy instructionDataAnalyzeStrategy) {
- List instructions = pseudocode.getInstructions();
- if (!straightDirection) {
- instructions = Lists.newArrayList(instructions);
- Collections.reverse(instructions);
- }
- for (Instruction instruction : instructions) {
- if (lookInside && instruction instanceof LocalDeclarationInstruction) {
- traverseAndAnalyzeInstructionGraph(((LocalDeclarationInstruction) instruction).getBody(), instructionDataAnalyzeStrategy);
- }
- Pair pair = dataMap.get(instruction);
- instructionDataAnalyzeStrategy.execute(instruction,
- pair != null ? pair.getFirst() : null,
- pair != null ? pair.getSecond() : null);
- }
- }
-
- public D getResultInfo() {
- return dataMap.get(pseudocode.getExitInstruction()).getFirst();
- }
-
- interface InstructionDataMergeStrategy {
- Pair execute(@NotNull Instruction instruction, @NotNull Collection incomingEdgesData);
- }
-
- interface InstructionDataAnalyzeStrategy {
- void execute(@NotNull Instruction instruction, @Nullable D enterData, @Nullable D exitData);
- }
-}
diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java
index 004e2cc739a..4a2fd8bb33a 100644
--- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java
+++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java
@@ -21,6 +21,10 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jet.lang.cfg.pseudocode.LocalDeclarationInstruction;
+import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode;
+import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowInstructionsGenerator;
+import org.jetbrains.jet.lang.cfg.pseudocode.PseudocodeImpl;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
@@ -45,12 +49,21 @@ public class JetControlFlowProcessor {
private final JetControlFlowBuilder builder;
private final BindingTrace trace;
- public JetControlFlowProcessor(BindingTrace trace, JetControlFlowBuilder builder) {
- this.builder = builder;
+ public JetControlFlowProcessor(BindingTrace trace) {
+ this.builder = new JetControlFlowInstructionsGenerator();
this.trace = trace;
}
- public void generate(@NotNull JetDeclaration subroutine) {
+ public Pseudocode generatePseudocode(@NotNull JetDeclaration subroutine) {
+ Pseudocode pseudocode = generate(subroutine);
+ ((PseudocodeImpl)pseudocode).postProcess();
+ for (LocalDeclarationInstruction localDeclarationInstruction : pseudocode.getLocalDeclarations()) {
+ ((PseudocodeImpl)localDeclarationInstruction.getBody()).postProcess();
+ }
+ return pseudocode;
+ }
+
+ private Pseudocode generate(@NotNull JetDeclaration subroutine) {
builder.enterSubroutine(subroutine);
if (subroutine instanceof JetDeclarationWithBody) {
JetDeclarationWithBody declarationWithBody = (JetDeclarationWithBody) subroutine;
@@ -67,7 +80,7 @@ public class JetControlFlowProcessor {
else {
subroutine.accept(new CFPVisitor(false));
}
- builder.exitSubroutine(subroutine);
+ return builder.exitSubroutine(subroutine);
}
private void processLocalDeclaration(@NotNull JetDeclaration subroutine) {
diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java
index a30b1de310f..be6a8f0028b 100644
--- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java
+++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java
@@ -17,15 +17,16 @@
package org.jetbrains.jet.lang.cfg;
import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
-import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiElement;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.pseudocode.*;
+import org.jetbrains.jet.lang.cfg.PseudocodeTraverser.*;
+import org.jetbrains.jet.lang.cfg.PseudocodeVariablesData.VariableInitState;
+import org.jetbrains.jet.lang.cfg.PseudocodeVariablesData.VariableUseState;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.diagnostics.Errors;
import org.jetbrains.jet.lang.psi.*;
@@ -33,13 +34,14 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
-import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
import org.jetbrains.jet.lang.types.JetType;
+import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.jet.plugin.JetMainDetector;
import java.util.*;
+import static org.jetbrains.jet.lang.cfg.PseudocodeVariablesData.VariableUseState.*;
import static org.jetbrains.jet.lang.diagnostics.Errors.*;
import static org.jetbrains.jet.lang.resolve.BindingContext.CAPTURED_IN_CLOSURE;
import static org.jetbrains.jet.lang.types.TypeUtils.NO_EXPECTED_TYPE;
@@ -49,52 +51,22 @@ import static org.jetbrains.jet.lang.types.TypeUtils.NO_EXPECTED_TYPE;
*/
public class JetFlowInformationProvider {
- private final Map pseudocodeMap;
+ private final JetDeclaration subroutine;
+ private final Pseudocode pseudocode;
+ private final PseudocodeVariablesData pseudocodeVariablesData;
private BindingTrace trace;
- public JetFlowInformationProvider(@NotNull JetDeclaration declaration, @NotNull final JetExpression bodyExpression, @NotNull JetControlFlowDataTraceFactory flowDataTraceFactory, @NotNull BindingTrace trace) {
+ public JetFlowInformationProvider(
+ @NotNull JetDeclaration declaration,
+ @NotNull BindingTrace trace) {
+
+ subroutine = declaration;
this.trace = trace;
- final JetPseudocodeTrace pseudocodeTrace = flowDataTraceFactory.createTrace(declaration);
- pseudocodeMap = new HashMap();
- final Map representativeInstructions = new HashMap();
- final Map loopInfo = Maps.newHashMap();
- JetPseudocodeTrace wrappedTrace = new JetPseudocodeTrace() {
- @Override
- public void recordControlFlowData(@NotNull JetElement element, @NotNull Pseudocode pseudocode) {
- pseudocodeTrace.recordControlFlowData(element, pseudocode);
- pseudocodeMap.put(element, pseudocode);
- }
-
- @Override
- public void recordRepresentativeInstruction(@NotNull JetElement element, @NotNull Instruction instruction) {
- Instruction oldValue = representativeInstructions.put(element, instruction);
-// assert oldValue == null : element.getText();
- pseudocodeTrace.recordRepresentativeInstruction(element, instruction);
- }
-
- @Override
- public void recordLoopInfo(JetExpression expression, LoopInfo blockInfo) {
- loopInfo.put(expression, blockInfo);
- pseudocodeTrace.recordLoopInfo(expression, blockInfo);
- }
-
- @Override
- public void close() {
- pseudocodeTrace.close();
- for (Pseudocode pseudocode : pseudocodeMap.values()) {
- pseudocode.postProcess();
- }
- }
- };
- JetControlFlowInstructionsGenerator instructionsGenerator = new JetControlFlowInstructionsGenerator(wrappedTrace);
- new JetControlFlowProcessor(trace, instructionsGenerator).generate(declaration);
- wrappedTrace.close();
+ pseudocode = new JetControlFlowProcessor(trace).generatePseudocode(declaration);
+ pseudocodeVariablesData = new PseudocodeVariablesData(pseudocode, trace.getBindingContext());
}
- private void collectReturnExpressions(@NotNull JetElement subroutine, @NotNull final Collection returnedExpressions) {
- Pseudocode pseudocode = pseudocodeMap.get(subroutine);
- assert pseudocode != null;
-
+ private void collectReturnExpressions(@NotNull final Collection returnedExpressions) {
final Set instructions = Sets.newHashSet(pseudocode.getInstructions());
SubroutineExitInstruction exitInstruction = pseudocode.getExitInstruction();
for (Instruction previousInstruction : exitInstruction.getPreviousInstructions()) {
@@ -148,15 +120,16 @@ public class JetFlowInformationProvider {
});
}
}
-
- public void checkDefiniteReturn(@NotNull final JetDeclarationWithBody function, final @NotNull JetType expectedReturnType) {
- assert function instanceof JetDeclaration;
+
+ public void checkDefiniteReturn(final @NotNull JetType expectedReturnType) {
+ assert subroutine instanceof JetDeclarationWithBody;
+ JetDeclarationWithBody function = (JetDeclarationWithBody) subroutine;
JetExpression bodyExpression = function.getBodyExpression();
if (bodyExpression == null) return;
-
+
List returnedExpressions = Lists.newArrayList();
- collectReturnExpressions(function.asElement(), returnedExpressions);
+ collectReturnExpressions(returnedExpressions);
boolean nothingReturned = returnedExpressions.isEmpty();
@@ -166,8 +139,8 @@ public class JetFlowInformationProvider {
trace.report(RETURN_TYPE_MISMATCH.on(bodyExpression, expectedReturnType));
}
final boolean blockBody = function.hasBlockBody();
-
- final Set rootUnreachableElements = collectUnreachableCode(function.asElement());
+
+ final Set rootUnreachableElements = collectUnreachableCode();
for (JetElement element : rootUnreachableElements) {
trace.report(UNREACHABLE_CODE.on(element));
}
@@ -195,10 +168,7 @@ public class JetFlowInformationProvider {
}
}
- private Set collectUnreachableCode(@NotNull JetElement subroutine) {
- Pseudocode pseudocode = pseudocodeMap.get(subroutine);
- assert pseudocode != null;
-
+ private Set collectUnreachableCode() {
Collection unreachableElements = Lists.newArrayList();
for (Instruction deadInstruction : pseudocode.getDeadInstructions()) {
if (deadInstruction instanceof JetElementInstruction &&
@@ -213,73 +183,61 @@ public class JetFlowInformationProvider {
////////////////////////////////////////////////////////////////////////////////
// Uninitialized variables analysis
- public void markUninitializedVariables(@NotNull JetElement subroutine, final boolean processLocalDeclaration) {
- final Pseudocode pseudocode = pseudocodeMap.get(subroutine);
- assert pseudocode != null;
-
- JetControlFlowGraphTraverser