diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java index fae5958f7d2..e3b91196931 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java @@ -22,7 +22,7 @@ public class JetObjectDeclaration extends JetNamedDeclaration implements JetClas @Override public String getName() { JetObjectDeclarationName nameAsDeclaration = getNameAsDeclaration(); - return nameAsDeclaration == null ? "ClassObj" : nameAsDeclaration.getName(); + return nameAsDeclaration == null ? null : nameAsDeclaration.getName(); } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java index 01c4cb717ad..c4b719d139a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -9,7 +9,9 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; +import org.jetbrains.jet.lang.types.DeferredType; import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.util.CommonSuppliers; import org.jetbrains.jet.util.slicedmap.*; import java.util.Collection; @@ -41,6 +43,10 @@ public interface BindingContext { WritableSlice PROCESSED = Slices.createSimpleSetSlice("PROCESSED"); WritableSlice STATEMENT = Slices.createRemovableSetSlice("STATEMENT"); WritableSlice DELEGATED = Slices.createRemovableSetSlice("DELEGATED"); + + enum DeferredTypeKey {DEFERRED_TYPE_KEY} + WritableSlice> DEFERRED_TYPES = Slices.createSimpleSlice("DEFERRED_TYPES"); + WritableSlice DEFERRED_TYPE = new CollectionSliceWrapper(DEFERRED_TYPES, CommonSuppliers.getArrayListSupplier()); WritableSlice BACKING_FIELD_REQUIRED = new Slices.SetSlice("BACKING_FIELD_REQUIRED", RewritePolicy.DO_NOTHING) { @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index 37dad7b2ce4..8056b1074bb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -5,6 +5,7 @@ import com.google.common.collect.Sets; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.containers.Queue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.cfg.JetFlowInformationProvider; @@ -21,6 +22,9 @@ import org.jetbrains.jet.util.slicedmap.WritableSlice; import java.util.*; import static org.jetbrains.jet.lang.diagnostics.Errors.*; +import static org.jetbrains.jet.lang.resolve.BindingContext.DEFERRED_TYPE; +import static org.jetbrains.jet.lang.resolve.BindingContext.DEFERRED_TYPES; +import static org.jetbrains.jet.lang.resolve.BindingContext.DeferredTypeKey.DEFERRED_TYPE_KEY; import static org.jetbrains.jet.lang.types.JetTypeInferrer.NO_EXPECTED_TYPE; /** @@ -29,14 +33,14 @@ import static org.jetbrains.jet.lang.types.JetTypeInferrer.NO_EXPECTED_TYPE; public class BodyResolver { private final TopDownAnalysisContext context; - private final BindingTraceAdapter traceForConstructors; - private final BindingTraceAdapter traceForMembers; + private final ObservableBindingTrace traceForConstructors; + private final ObservableBindingTrace traceForMembers; public BodyResolver(TopDownAnalysisContext context) { this.context = context; // This allows access to backing fields - this.traceForConstructors = new BindingTraceAdapter(context.getTrace()).addHandler(BindingContext.REFERENCE_TARGET, new BindingTraceAdapter.RecordHandler() { + this.traceForConstructors = new ObservableBindingTrace(context.getTrace()).addHandler(BindingContext.REFERENCE_TARGET, new ObservableBindingTrace.RecordHandler() { @Override public void handleRecord(WritableSlice slice, JetReferenceExpression expression, DeclarationDescriptor descriptor) { if (expression instanceof JetSimpleNameExpression) { @@ -52,7 +56,7 @@ public class BodyResolver { }); // This tracks access to properties in order to register primary constructor parameters that yield real fields (JET-9) - this.traceForMembers = new BindingTraceAdapter(context.getTrace()).addHandler(BindingContext.REFERENCE_TARGET, new BindingTraceAdapter.RecordHandler() { + this.traceForMembers = new ObservableBindingTrace(context.getTrace()).addHandler(BindingContext.REFERENCE_TARGET, new ObservableBindingTrace.RecordHandler() { @Override public void handleRecord(WritableSlice slice, JetReferenceExpression expression, DeclarationDescriptor descriptor) { if (descriptor instanceof PropertyDescriptor) { @@ -68,8 +72,6 @@ public class BodyResolver { public void resolveBehaviorDeclarationBodies() { -// bindOverrides(); - resolveDelegationSpecifierLists(); resolveClassAnnotations(); @@ -80,8 +82,35 @@ public class BodyResolver { resolveFunctionBodies(); checkIfPrimaryConstructorIsNecessary(); - -// checkOverrides(); + + computeDeferredTypes(); + } + + private void computeDeferredTypes() { + Collection deferredTypes = context.getTrace().get(DEFERRED_TYPES, DEFERRED_TYPE_KEY); + if (deferredTypes != null) { + final Queue queue = new Queue(deferredTypes.size()); + context.getTrace().addHandler(DEFERRED_TYPE, new ObservableBindingTrace.RecordHandler() { + @Override + public void handleRecord(WritableSlice deferredTypeKeyDeferredTypeWritableSlice, BindingContext.DeferredTypeKey key, DeferredType value) { + queue.addLast(value); + } + }); + for (DeferredType deferredType : deferredTypes) { + queue.addLast(deferredType); + } + while (!queue.isEmpty()) { + DeferredType deferredType = queue.pullFirst(); + if (!deferredType.isComputed()) { + try { + deferredType.getActualType(); // to compute + } + catch (ReenteringLazyValueComputationException e) { + // A problem should be reported while computing the type + } + } + } + } } private void checkIfPrimaryConstructorIsNecessary() { @@ -476,7 +505,7 @@ public class BodyResolver { } private void resolvePropertyAccessors(JetProperty property, PropertyDescriptor propertyDescriptor, JetScope declaringScope) { - BindingTraceAdapter fieldAccessTrackingTrace = createFieldTrackingTrace(propertyDescriptor); + ObservableBindingTrace fieldAccessTrackingTrace = createFieldTrackingTrace(propertyDescriptor); WritableScope accessorScope = new WritableScopeImpl(getPropertyDeclarationInnerScope(declaringScope, propertyDescriptor), declaringScope.getContainingDeclaration(), new TraceBasedRedeclarationHandler(context.getTrace())).setDebugName("Accessor scope"); accessorScope.addPropertyDescriptorByFieldName("$" + propertyDescriptor.getName(), propertyDescriptor); @@ -597,8 +626,8 @@ public class BodyResolver { } } - private BindingTraceAdapter createFieldTrackingTrace(final PropertyDescriptor propertyDescriptor) { - return new BindingTraceAdapter(traceForMembers).addHandler(BindingContext.REFERENCE_TARGET, new BindingTraceAdapter.RecordHandler() { + private ObservableBindingTrace createFieldTrackingTrace(final PropertyDescriptor propertyDescriptor) { + return new ObservableBindingTrace(traceForMembers).addHandler(BindingContext.REFERENCE_TARGET, new ObservableBindingTrace.RecordHandler() { @Override public void handleRecord(WritableSlice slice, JetReferenceExpression expression, DeclarationDescriptor descriptor) { if (expression instanceof JetSimpleNameExpression) { @@ -614,8 +643,8 @@ public class BodyResolver { }); } - private BindingTraceAdapter createFieldAssignTrackingTrace() { - return new BindingTraceAdapter(traceForConstructors).addHandler(BindingContext.VARIABLE_ASSIGNMENT, new BindingTraceAdapter.RecordHandler() { + private ObservableBindingTrace createFieldAssignTrackingTrace() { + return new ObservableBindingTrace(traceForConstructors).addHandler(BindingContext.VARIABLE_ASSIGNMENT, new ObservableBindingTrace.RecordHandler() { @Override public void handleRecord(WritableSlice jetExpressionBooleanWritableSlice, JetExpression expression, DeclarationDescriptor descriptor) { if (expression instanceof JetSimpleNameExpression) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index 4690faad394..cd36fcdc53c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -177,7 +177,7 @@ public class ClassDescriptorResolver { else { final JetExpression bodyExpression = function.getBodyExpression(); if (bodyExpression != null) { - returnType = new DeferredType(new LazyValue() { + returnType = DeferredType.create(trace, new LazyValueWithDefault(ErrorUtils.createErrorType("Recursive dependency")) { @Override protected JetType compute() { JetFlowInformationProvider flowInformationProvider = computeFlowData(function, bodyExpression); @@ -532,7 +532,7 @@ public class ClassDescriptorResolver { return ErrorUtils.createErrorType("No type, no body"); } else { // TODO : a risk of a memory leak - LazyValue lazyValue = new LazyValue() { + LazyValue lazyValue = new LazyValueWithDefault(ErrorUtils.createErrorType("Recursive dependency")) { @Override protected JetType compute() { JetFlowInformationProvider flowInformationProvider = computeFlowData(property, initializer); @@ -540,7 +540,7 @@ public class ClassDescriptorResolver { } }; if (allowDeferred) { - return new DeferredType(lazyValue); + return DeferredType.create(trace, lazyValue); } else { return lazyValue.get(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingTraceAdapter.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ObservableBindingTrace.java similarity index 85% rename from compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingTraceAdapter.java rename to compiler/frontend/src/org/jetbrains/jet/lang/resolve/ObservableBindingTrace.java index fd44d0231ab..928c463217b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingTraceAdapter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ObservableBindingTrace.java @@ -11,7 +11,7 @@ import java.util.Map; /** * @author abreslav */ -public class BindingTraceAdapter implements BindingTrace { +public class ObservableBindingTrace implements BindingTrace { public interface RecordHandler { void handleRecord(WritableSlice slice, K key, V value); @@ -19,7 +19,7 @@ public class BindingTraceAdapter implements BindingTrace { private final BindingTrace originalTrace; private Map handlers = Maps.newHashMap(); - public BindingTraceAdapter(BindingTrace originalTrace) { + public ObservableBindingTrace(BindingTrace originalTrace) { this.originalTrace = originalTrace; } @@ -52,7 +52,7 @@ public class BindingTraceAdapter implements BindingTrace { return originalTrace.get(slice, key); } - public BindingTraceAdapter addHandler(@NotNull WritableSlice slice, @NotNull RecordHandler handler) { + public ObservableBindingTrace addHandler(@NotNull WritableSlice slice, @NotNull RecordHandler handler) { handlers.put(slice, handler); return this; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java index 225a7069436..5847cf61cfd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java @@ -16,7 +16,7 @@ import java.util.Set; */ /*package*/ class TopDownAnalysisContext { - private final BindingTrace trace; + private final ObservableBindingTrace trace; private final JetSemanticServices semanticServices; private final ClassDescriptorResolver classDescriptorResolver; @@ -32,12 +32,12 @@ import java.util.Set; private final Map declaringScopes = Maps.newHashMap(); public TopDownAnalysisContext(JetSemanticServices semanticServices, BindingTrace trace) { - this.trace = trace; + this.trace = new ObservableBindingTrace(trace); this.semanticServices = semanticServices; this.classDescriptorResolver = semanticServices.getClassDescriptorResolver(trace); } - public BindingTrace getTrace() { + public ObservableBindingTrace getTrace() { return trace; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/DeferredType.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/DeferredType.java index b405df67340..d97ae1c5a64 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/DeferredType.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/DeferredType.java @@ -2,17 +2,28 @@ package org.jetbrains.jet.lang.types; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import java.util.List; +import static org.jetbrains.jet.lang.resolve.BindingContext.DEFERRED_TYPE; +import static org.jetbrains.jet.lang.resolve.BindingContext.DeferredTypeKey.DEFERRED_TYPE_KEY; + /** * @author abreslav */ public class DeferredType implements JetType { + + public static DeferredType create(BindingTrace trace, LazyValue lazyValue) { + DeferredType deferredType = new DeferredType(lazyValue); + trace.record(DEFERRED_TYPE, DEFERRED_TYPE_KEY, deferredType); + return deferredType; + } + private final LazyValue lazyValue; - public DeferredType(LazyValue lazyValue) { + private DeferredType(LazyValue lazyValue) { this.lazyValue = lazyValue; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index 7da4d79b325..bc1770da090 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -432,13 +432,13 @@ public class JetTypeInferrer { // This implements coercion to Unit TemporaryBindingTrace temporaryTraceExpectingUnit = TemporaryBindingTrace.create(trace); final boolean[] mismatch = new boolean[1]; - BindingTraceAdapter errorInterceptingTrace = makeTraceInterceptingTypeMismatch(temporaryTraceExpectingUnit, statementExpression, mismatch); + ObservableBindingTrace errorInterceptingTrace = makeTraceInterceptingTypeMismatch(temporaryTraceExpectingUnit, statementExpression, mismatch); newContext = newContext(errorInterceptingTrace, scope, newContext.dataFlowInfo, context.expectedType, context.expectedReturnType); result = blockLevelVisitor.getType(statementExpression, newContext); if (mismatch[0]) { TemporaryBindingTrace temporaryTraceNoExpectedType = TemporaryBindingTrace.create(trace); mismatch[0] = false; - BindingTraceAdapter interceptingTrace = makeTraceInterceptingTypeMismatch(temporaryTraceNoExpectedType, statementExpression, mismatch); + ObservableBindingTrace interceptingTrace = makeTraceInterceptingTypeMismatch(temporaryTraceNoExpectedType, statementExpression, mismatch); newContext = newContext(interceptingTrace, scope, newContext.dataFlowInfo, NO_EXPECTED_TYPE, context.expectedReturnType); result = blockLevelVisitor.getType(statementExpression, newContext); if (mismatch[0]) { @@ -474,8 +474,8 @@ public class JetTypeInferrer { return result; } - private BindingTraceAdapter makeTraceInterceptingTypeMismatch(final BindingTrace trace, final JetExpression expressionToWatch, final boolean[] mismatchFound) { - return new BindingTraceAdapter(trace) { + private ObservableBindingTrace makeTraceInterceptingTypeMismatch(final BindingTrace trace, final JetExpression expressionToWatch, final boolean[] mismatchFound) { + return new ObservableBindingTrace(trace) { @Override public void report(@NotNull Diagnostic diagnostic) { @@ -875,12 +875,12 @@ public class JetTypeInferrer { @Override public JetType visitObjectLiteralExpression(final JetObjectLiteralExpression expression, final TypeInferenceContext context) { final JetType[] result = new JetType[1]; - BindingTraceAdapter.RecordHandler handler = new BindingTraceAdapter.RecordHandler() { + ObservableBindingTrace.RecordHandler handler = new ObservableBindingTrace.RecordHandler() { @Override public void handleRecord(WritableSlice slice, PsiElement declaration, final ClassDescriptor descriptor) { if (slice == CLASS && declaration == expression.getObjectDeclaration()) { - JetType defaultType = new DeferredType(new LazyValue() { + JetType defaultType = DeferredType.create(context.trace, new LazyValueWithDefault(ErrorUtils.createErrorType("Recursive dependency")) { @Override protected JetType compute() { return descriptor.getDefaultType(); @@ -894,7 +894,7 @@ public class JetTypeInferrer { } } }; - BindingTraceAdapter traceAdapter = new BindingTraceAdapter(context.trace); + ObservableBindingTrace traceAdapter = new ObservableBindingTrace(context.trace); traceAdapter.addHandler(CLASS, handler); TopDownAnalyzer.processObject(semanticServices, traceAdapter, context.scope, context.scope.getContainingDeclaration(), expression.getObjectDeclaration()); return context.services.checkType(result[0], expression, context); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/LazyValue.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/LazyValue.java index 482df0533c3..ef310e545cc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/LazyValue.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/LazyValue.java @@ -17,6 +17,10 @@ public abstract class LazyValue { protected abstract T compute(); + protected T getValueOnErrorReentry() { + throw new ReenteringLazyValueComputationException(); + } + public boolean isComputed() { return state == State.ERROR || state == State.COMPUTED; } @@ -34,7 +38,7 @@ public abstract class LazyValue { case COMPUTED: return value; case ERROR: - throw new ReenteringLazyValueComputationException(); + return getValueOnErrorReentry(); } throw new IllegalStateException("Unreachable"); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/LazyValueWithDefault.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/LazyValueWithDefault.java new file mode 100644 index 00000000000..bd9f15fa26c --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/LazyValueWithDefault.java @@ -0,0 +1,17 @@ +package org.jetbrains.jet.lang.types; + +/** + * @author abreslav + */ +public abstract class LazyValueWithDefault extends LazyValue { + private final T defaultValue; + + protected LazyValueWithDefault(T defaultValue) { + this.defaultValue = defaultValue; + } + + @Override + protected T getValueOnErrorReentry() { + return defaultValue; + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/ReenteringLazyValueComputationException.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/ReenteringLazyValueComputationException.java index 36847c3ea4c..1005fb72df7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/ReenteringLazyValueComputationException.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/ReenteringLazyValueComputationException.java @@ -7,15 +7,8 @@ public class ReenteringLazyValueComputationException extends RuntimeException { public ReenteringLazyValueComputationException() { } - public ReenteringLazyValueComputationException(String message) { - super(message); - } - - public ReenteringLazyValueComputationException(String message, Throwable cause) { - super(message, cause); - } - - public ReenteringLazyValueComputationException(Throwable cause) { - super(cause); + @Override + public synchronized Throwable fillInStackTrace() { + return this; } } diff --git a/compiler/frontend/src/org/jetbrains/jet/util/slicedmap/CollectionSliceWrapper.java b/compiler/frontend/src/org/jetbrains/jet/util/slicedmap/CollectionSliceWrapper.java new file mode 100644 index 00000000000..faded385ac3 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/util/slicedmap/CollectionSliceWrapper.java @@ -0,0 +1,57 @@ +package org.jetbrains.jet.util.slicedmap; + +import com.google.common.base.Supplier; + +import java.util.Collection; + +/** + * @author abreslav + */ +public class CollectionSliceWrapper implements WritableSlice { + + private final WritableSlice> wrapped; + private final SlicedMapKey myKey; + private final Supplier> supplier; + + public CollectionSliceWrapper(WritableSlice> wrapped, Supplier> supplier) { + this.wrapped = wrapped; + this.supplier = supplier; + this.myKey = new SlicedMapKey(this, null); + } + + @Override + public SlicedMapKey makeKey(K key) { + return myKey; + } + + @Override + public boolean check(K key, V value) { + assert value != null; + return true; + } + + @Override + public void afterPut(MutableSlicedMap map, K key, V value) { + Collection collection = map.get(wrapped, key); + if (collection == null) { + collection = supplier.get(); + map.put(wrapped, key, collection); + } + collection.add(value); + } + + @Override + public RewritePolicy getRewritePolicy() { + return RewritePolicy.DO_NOTHING; + } + + @Override + public V computeValue(SlicedMap map, K key, V value, boolean valueNotFound) { + throw new UnsupportedOperationException("Don't read by this slice, use the wrapped one"); + } + + @Override + public ReadOnlySlice makeRawValueVersion() { + return this; + } +} \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/util/slicedmap/SlicedMapImpl.java b/compiler/frontend/src/org/jetbrains/jet/util/slicedmap/SlicedMapImpl.java index 0aebe1aa744..36dbf297929 100644 --- a/compiler/frontend/src/org/jetbrains/jet/util/slicedmap/SlicedMapImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/util/slicedmap/SlicedMapImpl.java @@ -34,10 +34,11 @@ public class SlicedMapImpl implements MutableSlicedMap { return; } SlicedMapKey slicedMapKey = slice.makeKey(key); - if (slice.getRewritePolicy().rewriteProcessingNeeded(key)) { + RewritePolicy rewritePolicy = slice.getRewritePolicy(); + if (rewritePolicy.rewriteProcessingNeeded(key)) { if (map.containsKey(slicedMapKey)) { //noinspection unchecked - if (!slice.getRewritePolicy().processRewrite(slice, key, (V) map.get(slicedMapKey), value)) { + if (!rewritePolicy.processRewrite(slice, key, (V) map.get(slicedMapKey), value)) { return; } } @@ -70,4 +71,4 @@ public class SlicedMapImpl implements MutableSlicedMap { //noinspection unchecked return (Iterator) map.entrySet().iterator(); } -} +} \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/util/slicedmap/Slices.java b/compiler/frontend/src/org/jetbrains/jet/util/slicedmap/Slices.java index 9108f0a07f2..c5bbb7c135d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/util/slicedmap/Slices.java +++ b/compiler/frontend/src/org/jetbrains/jet/util/slicedmap/Slices.java @@ -160,10 +160,10 @@ public class Slices { public static class SetSlice extends BasicRemovableSlice { - protected SetSlice(String debugName, RewritePolicy rewritePolicy) { super(debugName, rewritePolicy); } + @Override public Boolean computeValue(SlicedMap map, K key, Boolean value, boolean valueNotFound) { if (valueNotFound) return false; diff --git a/idea/testData/checker/regression/Jet81.jet b/idea/testData/checker/regression/Jet81.jet index cafc4840db7..f6b382d86da 100644 --- a/idea/testData/checker/regression/Jet81.jet +++ b/idea/testData/checker/regression/Jet81.jet @@ -14,9 +14,9 @@ val a = object { { b + 1 } - val x = b + val x = b val y = 1 } -val b = a.x +val b = a.x val c = a.y diff --git a/idea/testData/checkerWithErrorTypes/full/regression/Jet81.jet b/idea/testData/checkerWithErrorTypes/full/regression/Jet81.jet index c3df9ba023f..a3ff4596172 100644 --- a/idea/testData/checkerWithErrorTypes/full/regression/Jet81.jet +++ b/idea/testData/checkerWithErrorTypes/full/regression/Jet81.jet @@ -14,9 +14,9 @@ val a = object { { b + 1 } - val x = b + val x = b val y = 1 } -val b = a.x +val b = a.x val c = a.y diff --git a/idea/testData/checkerWithErrorTypes/quick/DeferredTypes.jet b/idea/testData/checkerWithErrorTypes/quick/DeferredTypes.jet new file mode 100644 index 00000000000..8125ddbc904 --- /dev/null +++ b/idea/testData/checkerWithErrorTypes/quick/DeferredTypes.jet @@ -0,0 +1,3 @@ +trait T { + val a = Foo.bar() +}