Quickfix for NOTHING_TO_OVERRIDE

This commit is contained in:
Michał Sapalski
2013-03-02 15:08:00 +01:00
committed by Andrey Breslav
parent 231457df8e
commit 01c4826b06
51 changed files with 1169 additions and 159 deletions
@@ -21,7 +21,6 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.TraceBasedRedeclarationHandler;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl;
@@ -49,6 +48,9 @@ public class FunctionDescriptorUtil {
}
});
private FunctionDescriptorUtil() {
}
public static Map<TypeConstructor, TypeProjection> createSubstitutionContext(@NotNull FunctionDescriptor functionDescriptor, List<JetType> typeArguments) {
if (functionDescriptor.getTypeParameters().isEmpty()) return Collections.emptyMap();
@@ -137,4 +139,47 @@ public class FunctionDescriptorUtil {
public static <D extends CallableDescriptor> D alphaConvertTypeParameters(D candidate) {
return (D) candidate.substitute(MAKE_TYPE_PARAMETERS_FRESH);
}
/**
* Returns function's copy with new parameter list. Note that parameters may belong to other methods or have incorrect "index" property
* -- it will be fixed by this function.
*/
@NotNull
public static FunctionDescriptor replaceFunctionParameters(
@NotNull FunctionDescriptor function,
@NotNull List<ValueParameterDescriptor> newParameters
) {
FunctionDescriptorImpl descriptor = new SimpleFunctionDescriptorImpl(
function.getContainingDeclaration(),
function.getAnnotations(),
function.getName(),
function.getKind());
List<ValueParameterDescriptor> parameters = new ArrayList<ValueParameterDescriptor>(newParameters.size());
int idx = 0;
for (ValueParameterDescriptor parameter : newParameters) {
JetType returnType = parameter.getReturnType();
assert returnType != null;
parameters.add(new ValueParameterDescriptorImpl(
descriptor,
idx,
parameter.getAnnotations(),
parameter.getName(),
returnType,
parameter.declaresDefaultValue(),
parameter.getVarargElementType())
);
idx++;
}
ReceiverParameterDescriptor receiver = function.getReceiverParameter();
descriptor.initialize(
receiver == null ? null : receiver.getType(),
function.getExpectedThisObject(),
function.getTypeParameters(),
parameters,
function.getReturnType(),
function.getModality(),
function.getVisibility());
return descriptor;
}
}
@@ -240,24 +240,12 @@ public class OverrideResolver {
) {
Queue<CallableMemberDescriptor> fromSuperQueue = new LinkedList<CallableMemberDescriptor>(notOverridden);
while (!fromSuperQueue.isEmpty()) {
CallableMemberDescriptor notOverriddenFromSuper = findMemberWithMaxVisibility(fromSuperQueue);
CallableMemberDescriptor notOverriddenFromSuper = VisibilityUtil.findMemberWithMaxVisibility(fromSuperQueue);
Collection<CallableMemberDescriptor> overridables = extractMembersOverridableBy(notOverriddenFromSuper, fromSuperQueue, sink);
createAndBindFakeOverride(notOverriddenFromSuper, overridables, current, sink);
}
}
@NotNull
private static CallableMemberDescriptor findMemberWithMaxVisibility(@NotNull Queue<CallableMemberDescriptor> descriptors) {
CallableMemberDescriptor descriptor = descriptors.element();
for (CallableMemberDescriptor candidate : descriptors) {
Integer result = Visibilities.compare(descriptor.getVisibility(), candidate.getVisibility());
if (result != null && result < 0) {
descriptor = candidate;
}
}
return descriptor;
}
private static void createAndBindFakeOverride(
@NotNull CallableMemberDescriptor notOverriddenFromSuper,
@NotNull Collection<CallableMemberDescriptor> overridables,
@@ -0,0 +1,37 @@
/*
* Copyright 2010-2013 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.resolve;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.Visibilities;
import java.util.Queue;
public class VisibilityUtil {
@NotNull
public static CallableMemberDescriptor findMemberWithMaxVisibility(@NotNull Queue<CallableMemberDescriptor> descriptors) {
CallableMemberDescriptor descriptor = descriptors.element();
for (CallableMemberDescriptor candidate : descriptors) {
Integer result = Visibilities.compare(descriptor.getVisibility(), candidate.getVisibility());
if (result != null && result < 0) {
descriptor = candidate;
}
}
return descriptor;
}
}