Added some new name and scope generation rules.

This commit is contained in:
Pavel Talanov
2012-02-15 16:56:56 +04:00
parent f86367dba7
commit 0f65ca0854
5 changed files with 88 additions and 50 deletions
@@ -15,6 +15,8 @@ import org.jetbrains.k2js.translate.context.generator.Rule;
import org.jetbrains.k2js.translate.intrinsic.Intrinsics;
import org.jetbrains.k2js.translate.utils.AnnotationsUtils;
import java.util.Set;
import static org.jetbrains.k2js.translate.utils.AnnotationsUtils.*;
import static org.jetbrains.k2js.translate.utils.DescriptorUtils.*;
@@ -23,7 +25,7 @@ import static org.jetbrains.k2js.translate.utils.DescriptorUtils.*;
* <p/>
* Aggregates all the static parts of the context.
*/
public class StaticContext {
public final class StaticContext {
public static StaticContext generateStaticContext(@NotNull JetStandardLibrary library,
@NotNull BindingContext bindingContext) {
@@ -272,6 +274,25 @@ public class StaticContext {
}
};
Rule<JsName> overridingDescriptorsReferToOriginalName = new Rule<JsName>() {
@Override
public JsName apply(@NotNull DeclarationDescriptor descriptor) {
//TODO: refactor
if (descriptor instanceof FunctionDescriptor) {
Set<? extends FunctionDescriptor> overriddenDescriptors = ((FunctionDescriptor) descriptor).getOverriddenDescriptors();
if (overriddenDescriptors.isEmpty()) {
return null;
} else {
//assert overriddenDescriptors.size() == 1;
//TODO: for now translator can't deal with multiple inheritance good enough
for (FunctionDescriptor overriddenDescriptor : overriddenDescriptors) {
return getNameForDescriptor(overriddenDescriptor);
}
}
}
return null;
}
};
addRule(namesForStandardClasses);
addRule(aliasOverridesNames);
addRule(constructorHasTheSameNameAsTheClass);
@@ -281,6 +302,7 @@ public class StaticContext {
addRule(propertiesCorrespondToSpeciallyTreatedBackingFieldNames);
addRule(namespacesShouldBeDefinedInRootScope);
addRule(accessorsHasNamesWithSpecialPrefixes);
addRule(overridingDescriptorsReferToOriginalName);
addRule(memberDeclarationsInsideParentsScope);
}
}
@@ -294,6 +316,31 @@ public class StaticContext {
private final class ScopeGenerator extends Generator<NamingScope> {
public ScopeGenerator() {
Rule<NamingScope> generateNewScopesForClassesWithNoAncestors = new Rule<NamingScope>() {
@Override
public NamingScope apply(@NotNull DeclarationDescriptor descriptor) {
if (!(descriptor instanceof ClassDescriptor)) {
return null;
}
if (getSuperclass((ClassDescriptor) descriptor) == null) {
return getRootScope().innerScope("Scope for class " + descriptor.getName());
}
return null;
}
};
Rule<NamingScope> generateInnerScopesForDerivedClasses = new Rule<NamingScope>() {
@Override
public NamingScope apply(@NotNull DeclarationDescriptor descriptor) {
if (!(descriptor instanceof ClassDescriptor)) {
return null;
}
ClassDescriptor superclass = getSuperclass((ClassDescriptor) descriptor);
if (superclass == null) {
return null;
}
return getScopeForDescriptor(superclass).innerScope("Scope for class " + descriptor.getName());
}
};
Rule<NamingScope> generateNewScopesForNamespaceDescriptors = new Rule<NamingScope>() {
@Override
public NamingScope apply(@NotNull DeclarationDescriptor descriptor) {
@@ -307,9 +354,11 @@ public class StaticContext {
@Override
public NamingScope apply(@NotNull DeclarationDescriptor descriptor) {
NamingScope enclosingScope = getEnclosingScope(descriptor);
return enclosingScope.innerScope("scope for member " + descriptor.getName());
return enclosingScope.innerScope("Scope for member " + descriptor.getName());
}
};
addRule(generateNewScopesForClassesWithNoAncestors);
addRule(generateInnerScopesForDerivedClasses);
addRule(generateNewScopesForNamespaceDescriptors);
addRule(generateInnerScopesForMembers);
}
@@ -16,8 +16,10 @@ import org.jetbrains.k2js.translate.general.Translation;
import java.util.ArrayList;
import java.util.List;
import static org.jetbrains.k2js.translate.utils.BindingUtils.*;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getClassDescriptor;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptorForConstructorParameter;
import static org.jetbrains.k2js.translate.utils.DescriptorUtils.findAncestorClass;
import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getSuperclassDescriptors;
import static org.jetbrains.k2js.translate.utils.PsiUtils.getPrimaryConstructorParameters;
/**
@@ -12,11 +12,9 @@ import org.jetbrains.jet.lang.types.JetStandardClasses;
import org.jetbrains.jet.lang.types.JetType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getVariableDescriptorForVariableAsFunction;
import static org.jetbrains.k2js.translate.utils.DescriptorUtils.isVariableAsFunction;
import static org.jetbrains.k2js.translate.utils.DescriptorUtils.*;
/**
* @author Pavel Talanov
@@ -118,28 +116,6 @@ public final class BindingUtils {
return (JetParameter) result;
}
@NotNull
public static List<ClassDescriptor> getSuperclassDescriptors(@NotNull ClassDescriptor classDescriptor) {
Collection<? extends JetType> superclassTypes = classDescriptor.getTypeConstructor().getSupertypes();
List<ClassDescriptor> superClassDescriptors = new ArrayList<ClassDescriptor>();
for (JetType type : superclassTypes) {
ClassDescriptor result = getClassDescriptorForType(type);
if (isNotAny(result)) {
superClassDescriptors.add(result);
}
}
return superClassDescriptors;
}
@NotNull
private static ClassDescriptor getClassDescriptorForType(@NotNull JetType type) {
DeclarationDescriptor superClassDescriptor =
type.getConstructor().getDeclarationDescriptor();
assert superClassDescriptor instanceof ClassDescriptor
: "Superclass descriptor of a type should be of type ClassDescriptor";
return (ClassDescriptor) superClassDescriptor;
}
public static boolean hasAncestorClass(@NotNull BindingContext context, @NotNull JetClassOrObject classDeclaration) {
ClassDescriptor classDescriptor = getClassDescriptor(context, classDeclaration);
List<ClassDescriptor> superclassDescriptors = getSuperclassDescriptors(classDescriptor);
@@ -202,7 +178,7 @@ public final class BindingUtils {
return referencedDescriptor;
}
private static boolean isNotAny(@NotNull DeclarationDescriptor superClassDescriptor) {
public static boolean isNotAny(@NotNull DeclarationDescriptor superClassDescriptor) {
return !superClassDescriptor.equals(JetStandardClasses.getAny());
}
@@ -10,7 +10,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.jetbrains.k2js.translate.utils.BindingUtils.getSuperclassDescriptors;
import static org.jetbrains.k2js.translate.utils.DescriptorUtils.getSuperclassDescriptors;
//TODO: can optimise using less dumb implementation
@@ -5,6 +5,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
import org.jetbrains.k2js.translate.context.Namer;
@@ -13,6 +14,8 @@ import java.util.Collection;
import java.util.List;
import java.util.Set;
import static org.jetbrains.k2js.translate.utils.BindingUtils.isNotAny;
/**
* @author Pavel Talanov
*/
@@ -41,26 +44,6 @@ public final class DescriptorUtils {
return (descriptor instanceof ConstructorDescriptor);
}
@NotNull
public static List<DeclarationDescriptor> getOwnDeclarations(@NotNull ClassDescriptor classDescriptor) {
Collection<DeclarationDescriptor> allDescriptors =
classDescriptor.getDefaultType().getMemberScope().getAllDescriptors();
return filterByOwner(classDescriptor, allDescriptors);
}
@NotNull
private static List<DeclarationDescriptor> filterByOwner(@NotNull DeclarationDescriptor ownerDescriptor,
@NotNull Collection<DeclarationDescriptor> allDescriptors) {
List<DeclarationDescriptor> resultingList = new ArrayList<DeclarationDescriptor>();
for (DeclarationDescriptor memberDescriptor : allDescriptors) {
if (memberDescriptor.getContainingDeclaration() == ownerDescriptor) {
resultingList.add(memberDescriptor);
}
}
return resultingList;
}
@NotNull
public static FunctionDescriptor getFunctionByName(@NotNull JetScope scope,
@NotNull String name) {
@@ -102,6 +85,33 @@ public final class DescriptorUtils {
return null;
}
@NotNull
public static List<ClassDescriptor> getSuperclassDescriptors(@NotNull ClassDescriptor classDescriptor) {
Collection<? extends JetType> superclassTypes = classDescriptor.getTypeConstructor().getSupertypes();
List<ClassDescriptor> superClassDescriptors = new ArrayList<ClassDescriptor>();
for (JetType type : superclassTypes) {
ClassDescriptor result = getClassDescriptorForType(type);
if (isNotAny(result)) {
superClassDescriptors.add(result);
}
}
return superClassDescriptors;
}
@Nullable
public static ClassDescriptor getSuperclass(@NotNull ClassDescriptor classDescriptor) {
return findAncestorClass(getSuperclassDescriptors(classDescriptor));
}
@NotNull
public static ClassDescriptor getClassDescriptorForType(@NotNull JetType type) {
DeclarationDescriptor superClassDescriptor =
type.getConstructor().getDeclarationDescriptor();
assert superClassDescriptor instanceof ClassDescriptor
: "Superclass descriptor of a type should be of type ClassDescriptor";
return (ClassDescriptor) superClassDescriptor;
}
@NotNull
public static VariableDescriptor getVariableDescriptorForVariableAsFunction
(@NotNull VariableAsFunctionDescriptor descriptor) {