Basic resolve to Java elements. One can resolve System.out.println(1), but not println("1") yet (only exact signature match works, no best fit overload is looked for).
This commit is contained in:
Generated
-1
@@ -6,7 +6,6 @@
|
|||||||
<option name="LINE_SEPARATOR" value=" " />
|
<option name="LINE_SEPARATOR" value=" " />
|
||||||
<option name="ELSE_ON_NEW_LINE" value="true" />
|
<option name="ELSE_ON_NEW_LINE" value="true" />
|
||||||
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" />
|
<option name="ALIGN_MULTILINE_BINARY_OPERATION" value="true" />
|
||||||
<option name="ALIGN_GROUP_FIELD_DECLARATIONS" value="true" />
|
|
||||||
<option name="IF_BRACE_FORCE" value="1" />
|
<option name="IF_BRACE_FORCE" value="1" />
|
||||||
<ADDITIONAL_INDENT_OPTIONS fileType="groovy">
|
<ADDITIONAL_INDENT_OPTIONS fileType="groovy">
|
||||||
<option name="INDENT_SIZE" value="2" />
|
<option name="INDENT_SIZE" value="2" />
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
package org.jetbrains.jet.codegen;
|
package org.jetbrains.jet.codegen;
|
||||||
|
|
||||||
|
import com.intellij.openapi.project.Project;
|
||||||
|
import org.jetbrains.jet.lang.ErrorHandler;
|
||||||
import org.jetbrains.jet.lang.JetSemanticServices;
|
import org.jetbrains.jet.lang.JetSemanticServices;
|
||||||
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
||||||
import org.jetbrains.jet.lang.psi.JetFunction;
|
import org.jetbrains.jet.lang.psi.JetFunction;
|
||||||
import org.jetbrains.jet.lang.psi.JetNamespace;
|
import org.jetbrains.jet.lang.psi.JetNamespace;
|
||||||
import org.jetbrains.jet.lang.psi.JetProperty;
|
import org.jetbrains.jet.lang.psi.JetProperty;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.*;
|
||||||
import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
|
import org.jetbrains.jet.lang.resolve.java.JavaLangScope;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
|
||||||
import org.objectweb.asm.ClassVisitor;
|
import org.objectweb.asm.ClassVisitor;
|
||||||
import org.objectweb.asm.Opcodes;
|
import org.objectweb.asm.Opcodes;
|
||||||
|
|
||||||
@@ -19,9 +22,15 @@ public class NamespaceCodegen {
|
|||||||
public NamespaceCodegen() {
|
public NamespaceCodegen() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void generate(JetNamespace namespace, ClassVisitor v, JetSemanticServices semanticServices) {
|
public void generate(JetNamespace namespace, ClassVisitor v, Project project) {
|
||||||
List<JetDeclaration> declarations = namespace.getDeclarations();
|
List<JetDeclaration> declarations = namespace.getDeclarations();
|
||||||
BindingContext bindingContext = new TopDownAnalyzer(semanticServices).process(semanticServices.getStandardLibrary().getLibraryScope(), declarations);
|
|
||||||
|
JetSemanticServices semanticServices = JetSemanticServices.createSemanticServices(project, ErrorHandler.THROW_EXCEPTION);
|
||||||
|
BindingTraceContext bindingTraceContext = new BindingTraceContext();
|
||||||
|
ScopeWithImports scope = new ScopeWithImports(semanticServices.getStandardLibrary().getLibraryScope());
|
||||||
|
scope.addImport(new JavaLangScope(new JavaSemanticServices(project, semanticServices, bindingTraceContext)));
|
||||||
|
new TopDownAnalyzer(semanticServices, bindingTraceContext).process(scope, declarations);
|
||||||
|
BindingContext bindingContext = bindingTraceContext;
|
||||||
|
|
||||||
final PropertyCodegen propertyCodegen = new PropertyCodegen(v);
|
final PropertyCodegen propertyCodegen = new PropertyCodegen(v);
|
||||||
final FunctionCodegen functionCodegen = new FunctionCodegen(v, semanticServices.getStandardLibrary(), bindingContext);
|
final FunctionCodegen functionCodegen = new FunctionCodegen(v, semanticServices.getStandardLibrary(), bindingContext);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package org.jetbrains.jet.lang.annotations;
|
|||||||
|
|
||||||
import com.intellij.lang.annotation.AnnotationHolder;
|
import com.intellij.lang.annotation.AnnotationHolder;
|
||||||
import com.intellij.lang.annotation.Annotator;
|
import com.intellij.lang.annotation.Annotator;
|
||||||
|
import com.intellij.openapi.project.Project;
|
||||||
import com.intellij.openapi.util.TextRange;
|
import com.intellij.openapi.util.TextRange;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -9,7 +10,11 @@ import org.jetbrains.jet.lang.ErrorHandler;
|
|||||||
import org.jetbrains.jet.lang.JetSemanticServices;
|
import org.jetbrains.jet.lang.JetSemanticServices;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
|
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
|
||||||
|
import org.jetbrains.jet.lang.resolve.ScopeWithImports;
|
||||||
import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
|
import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.JavaLangScope;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
|
||||||
import org.jetbrains.jet.lang.types.Type;
|
import org.jetbrains.jet.lang.types.Type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -20,6 +25,8 @@ public class JetPsiChecker implements Annotator {
|
|||||||
@Override
|
@Override
|
||||||
public void annotate(@NotNull PsiElement element, @NotNull final AnnotationHolder holder) {
|
public void annotate(@NotNull PsiElement element, @NotNull final AnnotationHolder holder) {
|
||||||
if (element instanceof JetFile) {
|
if (element instanceof JetFile) {
|
||||||
|
Project project = element.getProject();
|
||||||
|
|
||||||
JetFile file = (JetFile) element;
|
JetFile file = (JetFile) element;
|
||||||
JetSemanticServices semanticServices = JetSemanticServices.createSemanticServices(element.getProject(), new ErrorHandler() {
|
JetSemanticServices semanticServices = JetSemanticServices.createSemanticServices(element.getProject(), new ErrorHandler() {
|
||||||
@Override
|
@Override
|
||||||
@@ -28,7 +35,13 @@ public class JetPsiChecker implements Annotator {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
try {
|
try {
|
||||||
final BindingContext bindingContext = new TopDownAnalyzer(semanticServices).process(semanticServices.getStandardLibrary().getLibraryScope(), file.getRootNamespace().getDeclarations());
|
ScopeWithImports scope = new ScopeWithImports(semanticServices.getStandardLibrary().getLibraryScope());
|
||||||
|
BindingTraceContext bindingTraceContext = new BindingTraceContext();
|
||||||
|
scope.addImport(new JavaLangScope(new JavaSemanticServices(project, semanticServices, bindingTraceContext)));
|
||||||
|
new TopDownAnalyzer(semanticServices, bindingTraceContext).process(
|
||||||
|
scope,
|
||||||
|
file.getRootNamespace().getDeclarations());
|
||||||
|
final BindingContext bindingContext = bindingTraceContext;
|
||||||
file.getRootNamespace().accept(new JetVisitor() {
|
file.getRootNamespace().accept(new JetVisitor() {
|
||||||
@Override
|
@Override
|
||||||
public void visitClass(JetClass klass) {
|
public void visitClass(JetClass klass) {
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
package org.jetbrains.jet.lang.modules;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author abreslav
|
|
||||||
*/
|
|
||||||
public interface JetModule extends NamespaceDomain {
|
|
||||||
Collection<JetModule> getImports();
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
package org.jetbrains.jet.lang.modules;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.jet.lang.types.NamespaceDescriptor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author abreslav
|
|
||||||
*/
|
|
||||||
public interface NamespaceDomain {
|
|
||||||
@Nullable
|
|
||||||
NamespaceDescriptor getNamespace(String name);
|
|
||||||
}
|
|
||||||
@@ -11,7 +11,11 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import org.jetbrains.jet.lang.ErrorHandler;
|
import org.jetbrains.jet.lang.ErrorHandler;
|
||||||
import org.jetbrains.jet.lang.JetSemanticServices;
|
import org.jetbrains.jet.lang.JetSemanticServices;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
|
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
|
||||||
|
import org.jetbrains.jet.lang.resolve.ScopeWithImports;
|
||||||
import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
|
import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.JavaLangScope;
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
|
||||||
import org.jetbrains.jet.lexer.JetTokens;
|
import org.jetbrains.jet.lexer.JetTokens;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -68,7 +72,14 @@ public class JetReferenceExpression extends JetExpression {
|
|||||||
}
|
}
|
||||||
JetFile file = (JetFile) element;
|
JetFile file = (JetFile) element;
|
||||||
JetSemanticServices semanticServices = JetSemanticServices.createSemanticServices(element.getProject(), ErrorHandler.DO_NOTHING);
|
JetSemanticServices semanticServices = JetSemanticServices.createSemanticServices(element.getProject(), ErrorHandler.DO_NOTHING);
|
||||||
BindingContext bindingContext = new TopDownAnalyzer(semanticServices).process(semanticServices.getStandardLibrary().getLibraryScope(), file.getRootNamespace().getDeclarations());
|
|
||||||
|
ScopeWithImports scope = new ScopeWithImports(semanticServices.getStandardLibrary().getLibraryScope());
|
||||||
|
|
||||||
|
BindingTraceContext bindingTraceContext = new BindingTraceContext();
|
||||||
|
scope.addImport(new JavaLangScope(new JavaSemanticServices(element.getProject(), semanticServices, bindingTraceContext)));
|
||||||
|
|
||||||
|
new TopDownAnalyzer(semanticServices, bindingTraceContext).process(scope, file.getRootNamespace().getDeclarations());
|
||||||
|
BindingContext bindingContext = bindingTraceContext;
|
||||||
return bindingContext.resolveToDeclarationPsiElement(JetReferenceExpression.this);
|
return bindingContext.resolveToDeclarationPsiElement(JetReferenceExpression.this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,44 +7,19 @@ import org.jetbrains.jet.lang.types.*;
|
|||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
*/
|
*/
|
||||||
public class BindingContext {
|
public interface BindingContext {
|
||||||
public NamespaceDescriptor getNamespaceDescriptor(JetNamespace declaration) {
|
NamespaceDescriptor getNamespaceDescriptor(JetNamespace declaration);
|
||||||
return null;
|
ClassDescriptor getClassDescriptor(JetClass declaration);
|
||||||
}
|
FunctionDescriptor getFunctionDescriptor(JetFunction declaration);
|
||||||
|
PropertyDescriptor getPropertyDescriptor(JetProperty declaration);
|
||||||
|
|
||||||
public ClassDescriptor getClassDescriptor(JetClass declaration) {
|
Type getExpressionType(JetExpression expression);
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public FunctionDescriptor getFunctionDescriptor(JetFunction declaration) {
|
JetScope getTopLevelScope();
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PropertyDescriptor getPropertyDescriptor(JetProperty declaration) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Type getExpressionType(JetExpression expression) {
|
DeclarationDescriptor resolveReferenceExpression(JetReferenceExpression referenceExpression);
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JetScope getTopLevelScope() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public DeclarationDescriptor resolveReferenceExpression(JetReferenceExpression referenceExpression) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Type resolveTypeReference(JetTypeReference typeReference) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public PsiElement resolveToDeclarationPsiElement(JetReferenceExpression referenceExpression) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
Type resolveTypeReference(JetTypeReference typeReference);
|
||||||
|
PsiElement resolveToDeclarationPsiElement(JetReferenceExpression referenceExpression);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
package org.jetbrains.jet.lang.resolve;
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
|
import org.jetbrains.jet.lang.types.*;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author abreslav
|
||||||
|
*/
|
||||||
|
public class BindingTraceContext extends BindingTrace implements BindingContext {
|
||||||
|
private final Map<JetExpression, Type> expressionTypes = new HashMap<JetExpression, Type>();
|
||||||
|
private final Map<JetReferenceExpression, DeclarationDescriptor> resolutionResults = new HashMap<JetReferenceExpression, DeclarationDescriptor>();
|
||||||
|
private final Map<JetTypeReference, Type> types = new HashMap<JetTypeReference, Type>();
|
||||||
|
private final Map<DeclarationDescriptor, PsiElement> descriptorToDeclarations = new HashMap<DeclarationDescriptor, PsiElement>();
|
||||||
|
private final Map<PsiElement, DeclarationDescriptor> declarationsToDescriptors = new HashMap<PsiElement, DeclarationDescriptor>();
|
||||||
|
private JetScope toplevelScope;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void recordExpressionType(@NotNull JetExpression expression, @NotNull Type type) {
|
||||||
|
expressionTypes.put(expression, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void recordReferenceResolution(@NotNull JetReferenceExpression expression, @NotNull DeclarationDescriptor descriptor) {
|
||||||
|
resolutionResults.put(expression, descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void recordTypeResolution(@NotNull JetTypeReference typeReference, @NotNull Type type) {
|
||||||
|
types.put(typeReference, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void recordDeclarationResolution(@NotNull PsiElement declaration, @NotNull DeclarationDescriptor descriptor) {
|
||||||
|
descriptorToDeclarations.put(descriptor, declaration);
|
||||||
|
declarationsToDescriptors.put(declaration, descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setToplevelScope(JetScope toplevelScope) {
|
||||||
|
this.toplevelScope = toplevelScope;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
public NamespaceDescriptor getNamespaceDescriptor(JetNamespace declaration) {
|
||||||
|
return (NamespaceDescriptor) declarationsToDescriptors.get(declaration);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getClassDescriptor(JetClass declaration) {
|
||||||
|
return (ClassDescriptor) declarationsToDescriptors.get(declaration);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FunctionDescriptor getFunctionDescriptor(JetFunction declaration) {
|
||||||
|
return (FunctionDescriptor) declarationsToDescriptors.get(declaration);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PropertyDescriptor getPropertyDescriptor(JetProperty declaration) {
|
||||||
|
return (PropertyDescriptor) declarationsToDescriptors.get(declaration);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Type resolveTypeReference(JetTypeReference typeReference) {
|
||||||
|
return types.get(typeReference);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Type getExpressionType(JetExpression expression) {
|
||||||
|
return expressionTypes.get(expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DeclarationDescriptor resolveReferenceExpression(JetReferenceExpression referenceExpression) {
|
||||||
|
return resolutionResults.get(referenceExpression);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JetScope getTopLevelScope() {
|
||||||
|
return toplevelScope;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PsiElement resolveToDeclarationPsiElement(JetReferenceExpression referenceExpression) {
|
||||||
|
return descriptorToDeclarations.get(resolveReferenceExpression(referenceExpression));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -41,7 +41,6 @@ public class ClassDescriptorResolver {
|
|||||||
WritableScope members = resolveMembers(classElement, typeParameters, scope, parameterScope, superclasses);
|
WritableScope members = resolveMembers(classElement, typeParameters, scope, parameterScope, superclasses);
|
||||||
|
|
||||||
return new ClassDescriptorImpl(
|
return new ClassDescriptorImpl(
|
||||||
classElement,
|
|
||||||
AttributeResolver.INSTANCE.resolveAttributes(classElement.getModifierList()),
|
AttributeResolver.INSTANCE.resolveAttributes(classElement.getModifierList()),
|
||||||
!open,
|
!open,
|
||||||
classElement.getName(),
|
classElement.getName(),
|
||||||
@@ -140,7 +139,6 @@ public class ClassDescriptorResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FunctionDescriptorImpl functionDescriptor = new FunctionDescriptorImpl(
|
FunctionDescriptorImpl functionDescriptor = new FunctionDescriptorImpl(
|
||||||
function,
|
|
||||||
null,
|
null,
|
||||||
AttributeResolver.INSTANCE.resolveAttributes(function.getModifierList()),
|
AttributeResolver.INSTANCE.resolveAttributes(function.getModifierList()),
|
||||||
function.getName(),
|
function.getName(),
|
||||||
@@ -155,13 +153,14 @@ public class ClassDescriptorResolver {
|
|||||||
|
|
||||||
private List<ValueParameterDescriptor> resolveValueParameters(WritableScope parameterScope, List<JetParameter> valueParameters) {
|
private List<ValueParameterDescriptor> resolveValueParameters(WritableScope parameterScope, List<JetParameter> valueParameters) {
|
||||||
List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
|
List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
|
||||||
for (JetParameter valueParameter : valueParameters) {
|
for (int i = 0, valueParametersSize = valueParameters.size(); i < valueParametersSize; i++) {
|
||||||
|
JetParameter valueParameter = valueParameters.get(i);
|
||||||
JetTypeReference typeReference = valueParameter.getTypeReference();
|
JetTypeReference typeReference = valueParameter.getTypeReference();
|
||||||
|
|
||||||
assert typeReference != null : "Parameters without type annotations are not supported"; // TODO
|
assert typeReference != null : "Parameters without type annotations are not supported"; // TODO
|
||||||
|
|
||||||
ValueParameterDescriptor valueParameterDescriptor = new ValueParameterDescriptorImpl(
|
ValueParameterDescriptor valueParameterDescriptor = new ValueParameterDescriptorImpl(
|
||||||
valueParameter,
|
i,
|
||||||
AttributeResolver.INSTANCE.resolveAttributes(valueParameter.getModifierList()),
|
AttributeResolver.INSTANCE.resolveAttributes(valueParameter.getModifierList()),
|
||||||
valueParameter.getName(),
|
valueParameter.getName(),
|
||||||
typeResolver.resolveType(parameterScope, typeReference),
|
typeResolver.resolveType(parameterScope, typeReference),
|
||||||
@@ -190,7 +189,6 @@ public class ClassDescriptorResolver {
|
|||||||
private TypeParameterDescriptor resolveTypeParameter(WritableScope extensibleScope, JetTypeParameter typeParameter) {
|
private TypeParameterDescriptor resolveTypeParameter(WritableScope extensibleScope, JetTypeParameter typeParameter) {
|
||||||
JetTypeReference extendsBound = typeParameter.getExtendsBound();
|
JetTypeReference extendsBound = typeParameter.getExtendsBound();
|
||||||
TypeParameterDescriptor typeParameterDescriptor = new TypeParameterDescriptor(
|
TypeParameterDescriptor typeParameterDescriptor = new TypeParameterDescriptor(
|
||||||
typeParameter,
|
|
||||||
AttributeResolver.INSTANCE.resolveAttributes(typeParameter.getModifierList()),
|
AttributeResolver.INSTANCE.resolveAttributes(typeParameter.getModifierList()),
|
||||||
typeParameter.getVariance(),
|
typeParameter.getVariance(),
|
||||||
typeParameter.getName(),
|
typeParameter.getName(),
|
||||||
@@ -221,7 +219,6 @@ public class ClassDescriptorResolver {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public PropertyDescriptor resolvePropertyDescriptor(@NotNull JetScope scope, @NotNull JetParameter parameter) {
|
public PropertyDescriptor resolvePropertyDescriptor(@NotNull JetScope scope, @NotNull JetParameter parameter) {
|
||||||
return new PropertyDescriptorImpl(
|
return new PropertyDescriptorImpl(
|
||||||
parameter,
|
|
||||||
AttributeResolver.INSTANCE.resolveAttributes(parameter.getModifierList()),
|
AttributeResolver.INSTANCE.resolveAttributes(parameter.getModifierList()),
|
||||||
parameter.getName(),
|
parameter.getName(),
|
||||||
typeResolver.resolveType(scope, parameter.getTypeReference()));
|
typeResolver.resolveType(scope, parameter.getTypeReference()));
|
||||||
@@ -242,7 +239,6 @@ public class ClassDescriptorResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return new PropertyDescriptorImpl(
|
return new PropertyDescriptorImpl(
|
||||||
property,
|
|
||||||
AttributeResolver.INSTANCE.resolveAttributes(property.getModifierList()),
|
AttributeResolver.INSTANCE.resolveAttributes(property.getModifierList()),
|
||||||
property.getName(),
|
property.getName(),
|
||||||
type);
|
type);
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
package org.jetbrains.jet.lang.resolve;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.jet.lang.psi.JetElement;
|
|
||||||
import org.jetbrains.jet.lang.psi.JetFunction;
|
|
||||||
import org.jetbrains.jet.lang.psi.JetParameter;
|
|
||||||
import org.jetbrains.jet.lang.psi.JetTypeParameter;
|
|
||||||
import org.jetbrains.jet.lang.types.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author abreslav
|
|
||||||
*/
|
|
||||||
public class ResolveUtil {
|
|
||||||
@Nullable
|
|
||||||
private static <T extends JetElement> T getDeclarationElement(Object o) {
|
|
||||||
if (o instanceof DeclarationDescriptorImpl) {
|
|
||||||
@SuppressWarnings({"unchecked", "UnnecessaryLocalVariable"})
|
|
||||||
T psiElement = ((DeclarationDescriptorImpl<T>) o).getPsiElement();
|
|
||||||
return psiElement;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private static <T extends JetElement> T getDeclarationElement(DeclarationDescriptorImpl<T> descriptor) {
|
|
||||||
return descriptor.getPsiElement();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public static JetTypeParameter getJetTypeParameter(TypeParameterDescriptor parameterDescriptor) {
|
|
||||||
return getDeclarationElement(parameterDescriptor);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public static JetParameter getJetParameter(ValueParameterDescriptor parameterDescriptor) {
|
|
||||||
return (JetParameter) getDeclarationElement(parameterDescriptor);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public static JetFunction getJetFunction(FunctionDescriptor functionDescriptor) {
|
|
||||||
return getDeclarationElement(functionDescriptor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
package org.jetbrains.jet.lang.resolve;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.lang.types.*;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author abreslav
|
||||||
|
*/
|
||||||
|
public class ScopeWithImports implements JetScope {
|
||||||
|
|
||||||
|
private final List<JetScope> imports = new ArrayList<JetScope>();
|
||||||
|
private final JetScope scope;
|
||||||
|
|
||||||
|
public ScopeWithImports(JetScope scope) {
|
||||||
|
this.scope = scope;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addImport(JetScope imported) {
|
||||||
|
imports.add(0, imported);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getClass(@NotNull String name) {
|
||||||
|
ClassDescriptor descriptor = scope.getClass(name);
|
||||||
|
if (descriptor != null) return descriptor;
|
||||||
|
for (JetScope imported : imports) {
|
||||||
|
ClassDescriptor importedClass = imported.getClass(name);
|
||||||
|
if (importedClass != null) {
|
||||||
|
return importedClass;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PropertyDescriptor getProperty(@NotNull String name) {
|
||||||
|
PropertyDescriptor descriptor = scope.getProperty(name);
|
||||||
|
if (descriptor != null) return descriptor;
|
||||||
|
for (JetScope imported : imports) {
|
||||||
|
PropertyDescriptor importedDescriptor = imported.getProperty(name);
|
||||||
|
if (importedDescriptor != null) {
|
||||||
|
return importedDescriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ExtensionDescriptor getExtension(@NotNull String name) {
|
||||||
|
throw new UnsupportedOperationException(); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NamespaceDescriptor getNamespace(@NotNull String name) {
|
||||||
|
NamespaceDescriptor descriptor = scope.getNamespace(name);
|
||||||
|
if (descriptor != null) return descriptor;
|
||||||
|
for (JetScope imported : imports) {
|
||||||
|
NamespaceDescriptor importedDescriptor = imported.getNamespace(name);
|
||||||
|
if (importedDescriptor != null) {
|
||||||
|
return importedDescriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TypeParameterDescriptor getTypeParameter(@NotNull String name) {
|
||||||
|
throw new UnsupportedOperationException(); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Type getThisType() {
|
||||||
|
throw new UnsupportedOperationException(); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public FunctionGroup getFunctionGroup(@NotNull String name) {
|
||||||
|
throw new UnsupportedOperationException(); // TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,12 +1,14 @@
|
|||||||
package org.jetbrains.jet.lang.resolve;
|
package org.jetbrains.jet.lang.resolve;
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.JetSemanticServices;
|
import org.jetbrains.jet.lang.JetSemanticServices;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.lang.types.*;
|
import org.jetbrains.jet.lang.types.*;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
@@ -16,94 +18,24 @@ public class TopDownAnalyzer {
|
|||||||
private final Map<JetClass, MutableClassDescriptor> classes = new LinkedHashMap<JetClass, MutableClassDescriptor>();
|
private final Map<JetClass, MutableClassDescriptor> classes = new LinkedHashMap<JetClass, MutableClassDescriptor>();
|
||||||
private final Map<JetFunction, FunctionDescriptor> functions = new HashMap<JetFunction, FunctionDescriptor>();
|
private final Map<JetFunction, FunctionDescriptor> functions = new HashMap<JetFunction, FunctionDescriptor>();
|
||||||
private final Map<JetDeclaration, WritableScope> declaringScopes = new HashMap<JetDeclaration, WritableScope>();
|
private final Map<JetDeclaration, WritableScope> declaringScopes = new HashMap<JetDeclaration, WritableScope>();
|
||||||
private final Map<JetProperty, PropertyDescriptor> properties = new HashMap<JetProperty, PropertyDescriptor>();
|
|
||||||
private final Map<JetExpression, Type> expressionTypes = new HashMap<JetExpression, Type>();
|
|
||||||
private final Map<JetReferenceExpression, DeclarationDescriptor> resolutionResults = new HashMap<JetReferenceExpression, DeclarationDescriptor>();
|
|
||||||
private final Map<JetTypeReference, Type> types = new HashMap<JetTypeReference, Type>();
|
|
||||||
private final Map<DeclarationDescriptor, JetDeclaration> descriptorToDeclarations = new HashMap<DeclarationDescriptor, JetDeclaration>();
|
|
||||||
|
|
||||||
|
|
||||||
private final JetSemanticServices semanticServices;
|
private final JetSemanticServices semanticServices;
|
||||||
private final ClassDescriptorResolver classDescriptorResolver;
|
private final ClassDescriptorResolver classDescriptorResolver;
|
||||||
|
private final BindingTrace trace;
|
||||||
|
|
||||||
public TopDownAnalyzer(JetSemanticServices semanticServices) {
|
public TopDownAnalyzer(JetSemanticServices semanticServices, @NotNull BindingTrace bindingTrace) {
|
||||||
this.semanticServices = semanticServices;
|
this.semanticServices = semanticServices;
|
||||||
this.classDescriptorResolver = new ClassDescriptorResolver(semanticServices, new BindingTrace() {
|
this.classDescriptorResolver = new ClassDescriptorResolver(semanticServices, bindingTrace);
|
||||||
@Override
|
this.trace = bindingTrace;
|
||||||
public void recordExpressionType(@NotNull JetExpression expression, @NotNull Type type) {
|
|
||||||
expressionTypes.put(expression, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void recordReferenceResolution(@NotNull JetReferenceExpression expression, @NotNull DeclarationDescriptor descriptor) {
|
|
||||||
resolutionResults.put(expression, descriptor);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void recordTypeResolution(@NotNull JetTypeReference typeReference, @NotNull Type type) {
|
|
||||||
types.put(typeReference, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void recordDeclarationResolution(@NotNull JetDeclaration declaration, @NotNull DeclarationDescriptor descriptor) {
|
|
||||||
descriptorToDeclarations.put(descriptor, declaration);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public BindingContext process(@NotNull JetScope outerScope, @NotNull List<JetDeclaration> declarations) {
|
public void process(@NotNull JetScope outerScope, @NotNull List<JetDeclaration> declarations) {
|
||||||
final WritableScope toplevelScope = new WritableScope(outerScope);
|
final WritableScope toplevelScope = new WritableScope(outerScope);
|
||||||
|
trace.setToplevelScope(toplevelScope); // TODO : this is a hack
|
||||||
collectTypeDeclarators(toplevelScope, declarations);
|
collectTypeDeclarators(toplevelScope, declarations);
|
||||||
resolveTypeDeclarations();
|
resolveTypeDeclarations();
|
||||||
collectBehaviorDeclarators(toplevelScope, declarations);
|
collectBehaviorDeclarators(toplevelScope, declarations);
|
||||||
resolveBehaviorDeclarationBodies();
|
resolveBehaviorDeclarationBodies();
|
||||||
return new BindingContext() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NamespaceDescriptor getNamespaceDescriptor(JetNamespace declaration) {
|
|
||||||
throw new UnsupportedOperationException(); // TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ClassDescriptor getClassDescriptor(JetClass declaration) {
|
|
||||||
return classes.get(declaration);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public FunctionDescriptor getFunctionDescriptor(JetFunction declaration) {
|
|
||||||
return functions.get(declaration);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PropertyDescriptor getPropertyDescriptor(JetProperty declaration) {
|
|
||||||
return properties.get(declaration);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Type resolveTypeReference(JetTypeReference typeReference) {
|
|
||||||
return types.get(typeReference);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Type getExpressionType(JetExpression expression) {
|
|
||||||
return expressionTypes.get(expression);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DeclarationDescriptor resolveReferenceExpression(JetReferenceExpression referenceExpression) {
|
|
||||||
return resolutionResults.get(referenceExpression);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public JetScope getTopLevelScope() {
|
|
||||||
return toplevelScope;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PsiElement resolveToDeclarationPsiElement(JetReferenceExpression referenceExpression) {
|
|
||||||
return descriptorToDeclarations.get(resolveReferenceExpression(referenceExpression));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -137,6 +69,7 @@ public class TopDownAnalyzer {
|
|||||||
mutableClassDescriptor.setName(klass.getName());
|
mutableClassDescriptor.setName(klass.getName());
|
||||||
declaringScope.addClassDescriptor(mutableClassDescriptor);
|
declaringScope.addClassDescriptor(mutableClassDescriptor);
|
||||||
classes.put(klass, mutableClassDescriptor);
|
classes.put(klass, mutableClassDescriptor);
|
||||||
|
trace.recordDeclarationResolution(klass, mutableClassDescriptor);
|
||||||
declaringScopes.put(klass, declaringScope);
|
declaringScopes.put(klass, declaringScope);
|
||||||
return mutableClassDescriptor.getUnsubstitutedMemberScope();
|
return mutableClassDescriptor.getUnsubstitutedMemberScope();
|
||||||
}
|
}
|
||||||
@@ -204,13 +137,14 @@ public class TopDownAnalyzer {
|
|||||||
FunctionDescriptor descriptor = classDescriptorResolver.resolveFunctionDescriptor(declaringScope, function);
|
FunctionDescriptor descriptor = classDescriptorResolver.resolveFunctionDescriptor(declaringScope, function);
|
||||||
declaringScope.addFunctionDescriptor(descriptor);
|
declaringScope.addFunctionDescriptor(descriptor);
|
||||||
functions.put(function, descriptor);
|
functions.put(function, descriptor);
|
||||||
|
trace.recordDeclarationResolution(function, descriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processProperty(WritableScope declaringScope, JetProperty property) {
|
private void processProperty(WritableScope declaringScope, JetProperty property) {
|
||||||
declaringScopes.put(property, declaringScope);
|
declaringScopes.put(property, declaringScope);
|
||||||
PropertyDescriptor descriptor = classDescriptorResolver.resolvePropertyDescriptor(declaringScope, property);
|
PropertyDescriptor descriptor = classDescriptorResolver.resolvePropertyDescriptor(declaringScope, property);
|
||||||
declaringScope.addPropertyDescriptor(descriptor);
|
declaringScope.addPropertyDescriptor(descriptor);
|
||||||
properties.put(property, descriptor);
|
trace.recordDeclarationResolution(property, descriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processClassObject(JetClassObject classObject) {
|
private void processClassObject(JetClassObject classObject) {
|
||||||
@@ -243,27 +177,7 @@ public class TopDownAnalyzer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void resolveExpression(@NotNull JetScope scope, JetExpression expression, boolean preferBlock) {
|
private void resolveExpression(@NotNull JetScope scope, JetExpression expression, boolean preferBlock) {
|
||||||
semanticServices.getTypeInferrer(new BindingTrace() {
|
semanticServices.getTypeInferrer(trace).getType(scope, expression, preferBlock);
|
||||||
@Override
|
|
||||||
public void recordExpressionType(@NotNull JetExpression expression, @NotNull Type type) {
|
|
||||||
expressionTypes.put(expression, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void recordReferenceResolution(@NotNull JetReferenceExpression expression, @NotNull DeclarationDescriptor descriptor) {
|
|
||||||
resolutionResults.put(expression, descriptor);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void recordTypeResolution(@NotNull JetTypeReference typeReference, @NotNull Type type) {
|
|
||||||
types.put(typeReference, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void recordDeclarationResolution(@NotNull JetDeclaration declaration, @NotNull DeclarationDescriptor descriptor) {
|
|
||||||
throw new IllegalStateException();
|
|
||||||
}
|
|
||||||
}).getType(scope, expression, preferBlock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ public class TypeResolver {
|
|||||||
if (domain == null) {
|
if (domain == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return domain.getNamespace(expression.getReferencedName());
|
return domain.getMemberScope().getNamespace(expression.getReferencedName());
|
||||||
}
|
}
|
||||||
|
|
||||||
assert qualifier == null;
|
assert qualifier == null;
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
package org.jetbrains.jet.lang.resolve.java;
|
||||||
|
|
||||||
|
import com.intellij.psi.*;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.lang.resolve.JetScope;
|
||||||
|
import org.jetbrains.jet.lang.resolve.WritableFunctionGroup;
|
||||||
|
import org.jetbrains.jet.lang.types.*;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author abreslav
|
||||||
|
*/
|
||||||
|
public class JavaClassMembersScope implements JetScope {
|
||||||
|
private final PsiClass psiClass;
|
||||||
|
private final JavaSemanticServices semanticServices;
|
||||||
|
private final boolean staticMembers;
|
||||||
|
|
||||||
|
public JavaClassMembersScope(PsiClass psiClass, JavaSemanticServices semanticServices, boolean staticMembers) {
|
||||||
|
this.psiClass = psiClass;
|
||||||
|
this.semanticServices = semanticServices;
|
||||||
|
this.staticMembers = staticMembers;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getClass(@NotNull String name) {
|
||||||
|
throw new UnsupportedOperationException(); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PropertyDescriptor getProperty(@NotNull String name) {
|
||||||
|
PsiField field = psiClass.findFieldByName(name, true);
|
||||||
|
if (field == null) return null;
|
||||||
|
if (field.hasModifierProperty(PsiModifier.STATIC) != staticMembers) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
PropertyDescriptorImpl propertyDescriptor = new PropertyDescriptorImpl(
|
||||||
|
Collections.<Attribute>emptyList(),
|
||||||
|
field.getName(),
|
||||||
|
semanticServices.getTypeTransformer().transform(field.getType()));
|
||||||
|
semanticServices.getTrace().recordDeclarationResolution(field, propertyDescriptor);
|
||||||
|
return propertyDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public FunctionGroup getFunctionGroup(@NotNull String name) {
|
||||||
|
WritableFunctionGroup writableFunctionGroup = new WritableFunctionGroup(name);
|
||||||
|
PsiMethod[] allMethods = psiClass.getAllMethods();
|
||||||
|
for (PsiMethod method : allMethods) {
|
||||||
|
if (method.hasModifierProperty(PsiModifier.STATIC) != staticMembers) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!name.equals(method.getName())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
PsiParameter[] parameters = method.getParameterList().getParameters();
|
||||||
|
FunctionDescriptorImpl functionDescriptor = new FunctionDescriptorImpl(
|
||||||
|
null,
|
||||||
|
Collections.<Attribute>emptyList(), // TODO
|
||||||
|
name,
|
||||||
|
Collections.<TypeParameterDescriptor>emptyList(), // TODO
|
||||||
|
semanticServices.getDescriptorResolver().resolveParameterDescriptors(parameters),
|
||||||
|
semanticServices.getTypeTransformer().transform(method.getReturnType())
|
||||||
|
);
|
||||||
|
semanticServices.getTrace().recordDeclarationResolution(method, functionDescriptor);
|
||||||
|
writableFunctionGroup.addFunction(functionDescriptor);
|
||||||
|
}
|
||||||
|
return writableFunctionGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ExtensionDescriptor getExtension(@NotNull String name) {
|
||||||
|
throw new UnsupportedOperationException(); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NamespaceDescriptor getNamespace(@NotNull String name) {
|
||||||
|
throw new UnsupportedOperationException(); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TypeParameterDescriptor getTypeParameter(@NotNull String name) {
|
||||||
|
throw new UnsupportedOperationException(); // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Type getThisType() {
|
||||||
|
throw new UnsupportedOperationException(); // TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
package org.jetbrains.jet.lang.resolve.java;
|
||||||
|
|
||||||
|
import com.intellij.openapi.project.Project;
|
||||||
|
import com.intellij.psi.*;
|
||||||
|
import com.intellij.psi.search.GlobalSearchScope;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.lang.types.*;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author abreslav
|
||||||
|
*/
|
||||||
|
public class JavaDescriptorResolver {
|
||||||
|
|
||||||
|
protected final Map<String, ClassDescriptor> classDescriptorCache = new HashMap<String, ClassDescriptor>();
|
||||||
|
protected final Map<String, NamespaceDescriptor> namespaceDescriptorCache = new HashMap<String, NamespaceDescriptor>();
|
||||||
|
protected final JavaPsiFacade javaFacade;
|
||||||
|
protected final GlobalSearchScope javaSearchScope;
|
||||||
|
protected final JavaSemanticServices semanticServices;
|
||||||
|
|
||||||
|
public JavaDescriptorResolver(Project project, JavaSemanticServices semanticServices) {
|
||||||
|
this.javaFacade = JavaPsiFacade.getInstance(project);
|
||||||
|
this.javaSearchScope = GlobalSearchScope.allScope(project);
|
||||||
|
this.semanticServices = semanticServices;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public ClassDescriptor resolveClass(@NotNull PsiClass psiClass) {
|
||||||
|
String qualifiedName = psiClass.getQualifiedName();
|
||||||
|
ClassDescriptor classDescriptor = classDescriptorCache.get(qualifiedName);
|
||||||
|
if (classDescriptor == null) {
|
||||||
|
classDescriptor = createJavaClassDescriptor(psiClass);
|
||||||
|
classDescriptorCache.put(qualifiedName, classDescriptor);
|
||||||
|
}
|
||||||
|
return classDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public ClassDescriptor resolveClass(@NotNull String qualifiedName) {
|
||||||
|
ClassDescriptor classDescriptor = classDescriptorCache.get(qualifiedName);
|
||||||
|
if (classDescriptor == null) {
|
||||||
|
PsiClass psiClass = javaFacade.findClass(qualifiedName, javaSearchScope);
|
||||||
|
if (psiClass == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
classDescriptor = createJavaClassDescriptor(psiClass);
|
||||||
|
classDescriptorCache.put(qualifiedName, classDescriptor);
|
||||||
|
}
|
||||||
|
return classDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ClassDescriptor createJavaClassDescriptor(@NotNull PsiClass psiClass) {
|
||||||
|
String name = psiClass.getName();
|
||||||
|
PsiModifierList modifierList = psiClass.getModifierList();
|
||||||
|
ClassDescriptorImpl classDescriptor = new ClassDescriptorImpl(
|
||||||
|
Collections.<Attribute>emptyList(), // TODO
|
||||||
|
modifierList == null ? false : modifierList.hasModifierProperty(PsiModifier.FINAL),
|
||||||
|
name,
|
||||||
|
Collections.<TypeParameterDescriptor>emptyList(),
|
||||||
|
Collections.<Type>emptyList(),
|
||||||
|
new JavaClassMembersScope(psiClass, semanticServices, false)
|
||||||
|
);
|
||||||
|
semanticServices.getTrace().recordDeclarationResolution(psiClass, classDescriptor);
|
||||||
|
return classDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NamespaceDescriptor resolveNamespace(String qualifiedName) {
|
||||||
|
NamespaceDescriptor namespaceDescriptor = namespaceDescriptorCache.get(qualifiedName);
|
||||||
|
if (namespaceDescriptor == null) {
|
||||||
|
// TODO : packages
|
||||||
|
|
||||||
|
PsiClass psiClass = javaFacade.findClass(qualifiedName, javaSearchScope);
|
||||||
|
if (psiClass == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
namespaceDescriptor = createJavaNamespaceDescriptor(psiClass);
|
||||||
|
namespaceDescriptorCache.put(qualifiedName, namespaceDescriptor);
|
||||||
|
}
|
||||||
|
return namespaceDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
private NamespaceDescriptor createJavaNamespaceDescriptor(@NotNull PsiClass psiClass) {
|
||||||
|
NamespaceDescriptor namespaceDescriptor = new NamespaceDescriptor(
|
||||||
|
Collections.<Attribute>emptyList(), // TODO
|
||||||
|
psiClass.getName(),
|
||||||
|
new JavaClassMembersScope(psiClass, semanticServices, true)
|
||||||
|
);
|
||||||
|
semanticServices.getTrace().recordDeclarationResolution(psiClass, namespaceDescriptor);
|
||||||
|
return namespaceDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ValueParameterDescriptor> resolveParameterDescriptors(PsiParameter[] parameters) {
|
||||||
|
List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
|
||||||
|
for (int i = 0, parametersLength = parameters.length; i < parametersLength; i++) {
|
||||||
|
PsiParameter parameter = parameters[i];
|
||||||
|
result.add(new ValueParameterDescriptorImpl(
|
||||||
|
i,
|
||||||
|
Collections.<Attribute>emptyList(), // TODO
|
||||||
|
parameter.getName(),
|
||||||
|
semanticServices.getTypeTransformer().transform(parameter.getType()),
|
||||||
|
false,
|
||||||
|
parameter.isVarArgs()
|
||||||
|
));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package org.jetbrains.jet.lang.resolve.java;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.lang.resolve.JetScopeImpl;
|
||||||
|
import org.jetbrains.jet.lang.types.ClassDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.types.NamespaceDescriptor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author abreslav
|
||||||
|
*/
|
||||||
|
public class JavaLangScope extends JetScopeImpl {
|
||||||
|
|
||||||
|
private final JavaSemanticServices semanticServices;
|
||||||
|
|
||||||
|
public JavaLangScope(JavaSemanticServices semanticServices) {
|
||||||
|
this.semanticServices = semanticServices;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getClass(@NotNull String name) {
|
||||||
|
return semanticServices.getDescriptorResolver().resolveClass(getQualifiedName(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NamespaceDescriptor getNamespace(@NotNull String name) {
|
||||||
|
return semanticServices.getDescriptorResolver().resolveNamespace(getQualifiedName(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getQualifiedName(String name) {
|
||||||
|
return "java.lang." + name;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package org.jetbrains.jet.lang.resolve.java;
|
||||||
|
|
||||||
|
import com.intellij.openapi.project.Project;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.lang.JetSemanticServices;
|
||||||
|
import org.jetbrains.jet.lang.types.BindingTrace;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author abreslav
|
||||||
|
*/
|
||||||
|
public class JavaSemanticServices {
|
||||||
|
private final JavaTypeTransformer typeTransformer;
|
||||||
|
private final JavaDescriptorResolver descriptorResolver;
|
||||||
|
private final BindingTrace trace;
|
||||||
|
|
||||||
|
public JavaSemanticServices(Project project, JetSemanticServices jetSemanticServices, BindingTrace trace) {
|
||||||
|
this.trace = trace;
|
||||||
|
this.descriptorResolver = new JavaDescriptorResolver(project, this);
|
||||||
|
this.typeTransformer = new JavaTypeTransformer(jetSemanticServices.getStandardLibrary(), descriptorResolver);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public JavaTypeTransformer getTypeTransformer() {
|
||||||
|
return typeTransformer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JavaDescriptorResolver getDescriptorResolver() {
|
||||||
|
return descriptorResolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BindingTrace getTrace() {
|
||||||
|
return trace;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
package org.jetbrains.jet.lang.resolve.java;
|
||||||
|
|
||||||
|
import com.intellij.psi.*;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.lang.types.*;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author abreslav
|
||||||
|
*/
|
||||||
|
public class JavaTypeTransformer {
|
||||||
|
|
||||||
|
private final JavaDescriptorResolver resolver;
|
||||||
|
private final JetStandardLibrary standardLibrary;
|
||||||
|
private Map<String, Type> primitiveTypesMap;
|
||||||
|
|
||||||
|
public JavaTypeTransformer(JetStandardLibrary standardLibrary, JavaDescriptorResolver resolver) {
|
||||||
|
this.resolver = resolver;
|
||||||
|
this.standardLibrary = standardLibrary;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public Type transform(PsiType javaType) {
|
||||||
|
Type result = javaType.accept(new PsiTypeVisitor<Type>() {
|
||||||
|
@Override
|
||||||
|
public Type visitClassType(PsiClassType classType) {
|
||||||
|
PsiClass psiClass = classType.resolveGenerics().getElement();
|
||||||
|
ClassDescriptor descriptor = resolver.resolveClass(psiClass);
|
||||||
|
// TODO : parameters
|
||||||
|
return new TypeImpl(descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Type visitPrimitiveType(PsiPrimitiveType primitiveType) {
|
||||||
|
String canonicalText = primitiveType.getCanonicalText();
|
||||||
|
Type type = getPrimitiveTypesMap().get(canonicalText);
|
||||||
|
assert type != null : canonicalText;
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Type visitArrayType(PsiArrayType arrayType) {
|
||||||
|
return JetStandardClasses.getUnitType(); // TODO!!!
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Type> getPrimitiveTypesMap() {
|
||||||
|
if (primitiveTypesMap == null) {
|
||||||
|
primitiveTypesMap = new HashMap<String, Type>();
|
||||||
|
primitiveTypesMap.put("byte", standardLibrary.getByteType());
|
||||||
|
primitiveTypesMap.put("short", standardLibrary.getShortType());
|
||||||
|
primitiveTypesMap.put("char", standardLibrary.getCharType());
|
||||||
|
primitiveTypesMap.put("int", standardLibrary.getIntType());
|
||||||
|
primitiveTypesMap.put("long", standardLibrary.getLongType());
|
||||||
|
primitiveTypesMap.put("float", standardLibrary.getFloatType());
|
||||||
|
primitiveTypesMap.put("double", standardLibrary.getDoubleType());
|
||||||
|
primitiveTypesMap.put("boolean", standardLibrary.getBooleanType());
|
||||||
|
primitiveTypesMap.put("void", JetStandardClasses.getUnitType());
|
||||||
|
}
|
||||||
|
return primitiveTypesMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,9 @@
|
|||||||
package org.jetbrains.jet.lang.types;
|
package org.jetbrains.jet.lang.types;
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.lang.psi.JetExpression;
|
import org.jetbrains.jet.lang.resolve.JetScope;
|
||||||
import org.jetbrains.jet.lang.psi.JetReferenceExpression;
|
|
||||||
import org.jetbrains.jet.lang.psi.JetTypeReference;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
@@ -19,11 +18,15 @@ public class BindingTrace {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void recordDeclarationResolution(@NotNull JetDeclaration declaration, @NotNull DeclarationDescriptor descriptor) {
|
public void recordDeclarationResolution(@NotNull PsiElement declaration, @NotNull DeclarationDescriptor descriptor) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void recordTypeResolution(@NotNull JetTypeReference typeReference, @NotNull Type type) {
|
public void recordTypeResolution(@NotNull JetTypeReference typeReference, @NotNull Type type) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setToplevelScope(JetScope toplevelScope) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package org.jetbrains.jet.lang.types;
|
package org.jetbrains.jet.lang.types;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.psi.JetClass;
|
|
||||||
import org.jetbrains.jet.lang.resolve.JetScope;
|
import org.jetbrains.jet.lang.resolve.JetScope;
|
||||||
import org.jetbrains.jet.lang.resolve.SubstitutingScope;
|
import org.jetbrains.jet.lang.resolve.SubstitutingScope;
|
||||||
|
|
||||||
@@ -13,22 +12,21 @@ import java.util.Map;
|
|||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
*/
|
*/
|
||||||
public class ClassDescriptorImpl extends DeclarationDescriptorImpl<JetClass> implements ClassDescriptor {
|
public class ClassDescriptorImpl extends DeclarationDescriptorImpl implements ClassDescriptor {
|
||||||
private final TypeConstructor typeConstructor;
|
private final TypeConstructor typeConstructor;
|
||||||
private final JetScope memberDeclarations;
|
private final JetScope memberDeclarations;
|
||||||
|
|
||||||
public ClassDescriptorImpl(
|
public ClassDescriptorImpl(
|
||||||
JetClass psiElement,
|
|
||||||
List<Attribute> attributes, boolean sealed,
|
List<Attribute> attributes, boolean sealed,
|
||||||
String name, List<TypeParameterDescriptor> typeParameters,
|
String name, List<TypeParameterDescriptor> typeParameters,
|
||||||
Collection<? extends Type> superclasses, JetScope memberDeclarations) {
|
Collection<? extends Type> superclasses, JetScope memberDeclarations) {
|
||||||
super(psiElement, attributes, name);
|
super(attributes, name);
|
||||||
this.typeConstructor = new TypeConstructor(attributes, sealed, name, typeParameters, superclasses);
|
this.typeConstructor = new TypeConstructor(attributes, sealed, name, typeParameters, superclasses);
|
||||||
this.memberDeclarations = memberDeclarations;
|
this.memberDeclarations = memberDeclarations;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClassDescriptorImpl(String name, JetScope memberDeclarations) {
|
public ClassDescriptorImpl(String name, JetScope memberDeclarations) {
|
||||||
this(null, Collections.<Attribute>emptyList(), true,
|
this(Collections.<Attribute>emptyList(), true,
|
||||||
name, Collections.<TypeParameterDescriptor>emptyList(),
|
name, Collections.<TypeParameterDescriptor>emptyList(),
|
||||||
Collections.<Type>singleton(JetStandardClasses.getAnyType()), memberDeclarations);
|
Collections.<Type>singleton(JetStandardClasses.getAnyType()), memberDeclarations);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +1,21 @@
|
|||||||
package org.jetbrains.jet.lang.types;
|
package org.jetbrains.jet.lang.types;
|
||||||
|
|
||||||
import org.jetbrains.jet.lang.psi.JetElement;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
*/
|
*/
|
||||||
public abstract class DeclarationDescriptorImpl<T extends JetElement> extends AnnotatedImpl implements Named, DeclarationDescriptor {
|
public abstract class DeclarationDescriptorImpl extends AnnotatedImpl implements Named, DeclarationDescriptor {
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
private final T psiElement;
|
|
||||||
|
|
||||||
public DeclarationDescriptorImpl(T psiElement, List<Attribute> attributes, String name) {
|
public DeclarationDescriptorImpl(List<Attribute> attributes, String name) {
|
||||||
super(attributes);
|
super(attributes);
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.psiElement = psiElement;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public T getPsiElement() {
|
|
||||||
return psiElement;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import java.util.*;
|
|||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
*/
|
*/
|
||||||
public class FunctionDescriptorImpl extends DeclarationDescriptorImpl<JetFunction> implements FunctionDescriptor {
|
public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements FunctionDescriptor {
|
||||||
@NotNull
|
@NotNull
|
||||||
private final List<TypeParameterDescriptor> typeParameters;
|
private final List<TypeParameterDescriptor> typeParameters;
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -20,14 +20,13 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl<JetFunctio
|
|||||||
private final FunctionDescriptor original;
|
private final FunctionDescriptor original;
|
||||||
|
|
||||||
public FunctionDescriptorImpl(
|
public FunctionDescriptorImpl(
|
||||||
JetFunction psiElement,
|
|
||||||
@Nullable FunctionDescriptor original,
|
@Nullable FunctionDescriptor original,
|
||||||
@NotNull List<Attribute> attributes,
|
@NotNull List<Attribute> attributes,
|
||||||
String name,
|
String name,
|
||||||
@NotNull List<TypeParameterDescriptor> typeParameters,
|
@NotNull List<TypeParameterDescriptor> typeParameters,
|
||||||
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
|
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
|
||||||
@NotNull Type unsubstitutedReturnType) {
|
@NotNull Type unsubstitutedReturnType) {
|
||||||
super(psiElement, attributes, name);
|
super(attributes, name);
|
||||||
this.original = original;
|
this.original = original;
|
||||||
this.typeParameters = typeParameters;
|
this.typeParameters = typeParameters;
|
||||||
this.unsubstitutedValueParameters = unsubstitutedValueParameters;
|
this.unsubstitutedValueParameters = unsubstitutedValueParameters;
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package org.jetbrains.jet.lang.types;
|
package org.jetbrains.jet.lang.types;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.resolve.ResolveUtil;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@@ -42,10 +41,12 @@ public class FunctionDescriptorUtil {
|
|||||||
public static List<ValueParameterDescriptor> getSubstitutedValueParameters(@NotNull FunctionDescriptor functionDescriptor, @NotNull List<Type> typeArguments) {
|
public static List<ValueParameterDescriptor> getSubstitutedValueParameters(@NotNull FunctionDescriptor functionDescriptor, @NotNull List<Type> typeArguments) {
|
||||||
List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
|
List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
|
||||||
Map<TypeConstructor, TypeProjection> context = createSubstitutionContext(functionDescriptor, typeArguments);
|
Map<TypeConstructor, TypeProjection> context = createSubstitutionContext(functionDescriptor, typeArguments);
|
||||||
for (ValueParameterDescriptor unsubstitutedValueParameter : functionDescriptor.getUnsubstitutedValueParameters()) {
|
List<ValueParameterDescriptor> unsubstitutedValueParameters = functionDescriptor.getUnsubstitutedValueParameters();
|
||||||
|
for (int i = 0, unsubstitutedValueParametersSize = unsubstitutedValueParameters.size(); i < unsubstitutedValueParametersSize; i++) {
|
||||||
|
ValueParameterDescriptor unsubstitutedValueParameter = unsubstitutedValueParameters.get(i);
|
||||||
// TODO : Lazy?
|
// TODO : Lazy?
|
||||||
result.add(new ValueParameterDescriptorImpl(
|
result.add(new ValueParameterDescriptorImpl(
|
||||||
ResolveUtil.getJetParameter(unsubstitutedValueParameter),
|
i,
|
||||||
unsubstitutedValueParameter.getAttributes(),
|
unsubstitutedValueParameter.getAttributes(),
|
||||||
unsubstitutedValueParameter.getName(),
|
unsubstitutedValueParameter.getName(),
|
||||||
TypeSubstitutor.INSTANCE.substitute(context, unsubstitutedValueParameter.getType(), Variance.IN_VARIANCE),
|
TypeSubstitutor.INSTANCE.substitute(context, unsubstitutedValueParameter.getType(), Variance.IN_VARIANCE),
|
||||||
@@ -81,7 +82,6 @@ public class FunctionDescriptorUtil {
|
|||||||
return functionDescriptor;
|
return functionDescriptor;
|
||||||
}
|
}
|
||||||
return new FunctionDescriptorImpl(
|
return new FunctionDescriptorImpl(
|
||||||
ResolveUtil.getJetFunction(functionDescriptor),
|
|
||||||
functionDescriptor,
|
functionDescriptor,
|
||||||
// TODO : substitute
|
// TODO : substitute
|
||||||
functionDescriptor.getAttributes(),
|
functionDescriptor.getAttributes(),
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ public class JetStandardClasses {
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
private static ClassDescriptor NOTHING_CLASS = new ClassDescriptorImpl(
|
private static ClassDescriptor NOTHING_CLASS = new ClassDescriptorImpl(
|
||||||
null,
|
|
||||||
Collections.<Attribute>emptyList(),
|
Collections.<Attribute>emptyList(),
|
||||||
true,
|
true,
|
||||||
"Nothing",
|
"Nothing",
|
||||||
@@ -54,7 +53,6 @@ public class JetStandardClasses {
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
private static final ClassDescriptor ANY = new ClassDescriptorImpl(
|
private static final ClassDescriptor ANY = new ClassDescriptorImpl(
|
||||||
null,
|
|
||||||
Collections.<Attribute>emptyList(),
|
Collections.<Attribute>emptyList(),
|
||||||
false,
|
false,
|
||||||
"Any",
|
"Any",
|
||||||
@@ -80,13 +78,11 @@ public class JetStandardClasses {
|
|||||||
List<TypeParameterDescriptor> parameters = new ArrayList<TypeParameterDescriptor>();
|
List<TypeParameterDescriptor> parameters = new ArrayList<TypeParameterDescriptor>();
|
||||||
for (int j = 0; j < i; j++) {
|
for (int j = 0; j < i; j++) {
|
||||||
parameters.add(new TypeParameterDescriptor(
|
parameters.add(new TypeParameterDescriptor(
|
||||||
null,
|
|
||||||
Collections.<Attribute>emptyList(),
|
Collections.<Attribute>emptyList(),
|
||||||
Variance.OUT_VARIANCE, "T" + j,
|
Variance.OUT_VARIANCE, "T" + j,
|
||||||
Collections.singleton(getNullableAnyType())));
|
Collections.singleton(getNullableAnyType())));
|
||||||
}
|
}
|
||||||
TUPLE[i] = new ClassDescriptorImpl(
|
TUPLE[i] = new ClassDescriptorImpl(
|
||||||
null,
|
|
||||||
Collections.<Attribute>emptyList(),
|
Collections.<Attribute>emptyList(),
|
||||||
true,
|
true,
|
||||||
"Tuple" + i,
|
"Tuple" + i,
|
||||||
@@ -107,30 +103,25 @@ public class JetStandardClasses {
|
|||||||
List<TypeParameterDescriptor> parameters = new ArrayList<TypeParameterDescriptor>();
|
List<TypeParameterDescriptor> parameters = new ArrayList<TypeParameterDescriptor>();
|
||||||
for (int j = 0; j < i; j++) {
|
for (int j = 0; j < i; j++) {
|
||||||
parameters.add(new TypeParameterDescriptor(
|
parameters.add(new TypeParameterDescriptor(
|
||||||
null,
|
|
||||||
Collections.<Attribute>emptyList(),
|
Collections.<Attribute>emptyList(),
|
||||||
Variance.IN_VARIANCE, "P" + j,
|
Variance.IN_VARIANCE, "P" + j,
|
||||||
Collections.singleton(getNullableAnyType())));
|
Collections.singleton(getNullableAnyType())));
|
||||||
}
|
}
|
||||||
parameters.add(new TypeParameterDescriptor(
|
parameters.add(new TypeParameterDescriptor(
|
||||||
null,
|
Collections.<Attribute>emptyList(),
|
||||||
Collections.<Attribute>emptyList(),
|
|
||||||
Variance.OUT_VARIANCE, "R",
|
Variance.OUT_VARIANCE, "R",
|
||||||
Collections.singleton(getNullableAnyType())));
|
Collections.singleton(getNullableAnyType())));
|
||||||
FUNCTION[i] = new ClassDescriptorImpl(
|
FUNCTION[i] = new ClassDescriptorImpl(
|
||||||
null,
|
|
||||||
Collections.<Attribute>emptyList(),
|
Collections.<Attribute>emptyList(),
|
||||||
false,
|
false,
|
||||||
"Function" + i,
|
"Function" + i,
|
||||||
parameters,
|
parameters,
|
||||||
Collections.singleton(getAnyType()), STUB);
|
Collections.singleton(getAnyType()), STUB);
|
||||||
parameters.add(0, new TypeParameterDescriptor(
|
parameters.add(0, new TypeParameterDescriptor(
|
||||||
null,
|
Collections.<Attribute>emptyList(),
|
||||||
Collections.<Attribute>emptyList(),
|
|
||||||
Variance.IN_VARIANCE, "T",
|
Variance.IN_VARIANCE, "T",
|
||||||
Collections.singleton(getNullableAnyType())));
|
Collections.singleton(getNullableAnyType())));
|
||||||
RECEIVER_FUNCTION[i] = new ClassDescriptorImpl(
|
RECEIVER_FUNCTION[i] = new ClassDescriptorImpl(
|
||||||
null,
|
|
||||||
Collections.<Attribute>emptyList(),
|
Collections.<Attribute>emptyList(),
|
||||||
false,
|
false,
|
||||||
"ReceiverFunction" + i,
|
"ReceiverFunction" + i,
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import org.jetbrains.jet.lang.JetFileType;
|
|||||||
import org.jetbrains.jet.lang.JetSemanticServices;
|
import org.jetbrains.jet.lang.JetSemanticServices;
|
||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
|
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
|
||||||
import org.jetbrains.jet.lang.resolve.JetScope;
|
import org.jetbrains.jet.lang.resolve.JetScope;
|
||||||
import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
|
import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
|
||||||
|
|
||||||
@@ -52,8 +53,11 @@ public class JetStandardLibrary {
|
|||||||
JetFileType.INSTANCE, FileUtil.loadTextAndClose(new InputStreamReader(stream)));
|
JetFileType.INSTANCE, FileUtil.loadTextAndClose(new InputStreamReader(stream)));
|
||||||
|
|
||||||
JetSemanticServices bootstrappingSemanticServices = JetSemanticServices.createSemanticServices(this, ErrorHandler.DO_NOTHING);
|
JetSemanticServices bootstrappingSemanticServices = JetSemanticServices.createSemanticServices(this, ErrorHandler.DO_NOTHING);
|
||||||
TopDownAnalyzer bootstrappingTDA = new TopDownAnalyzer(bootstrappingSemanticServices);
|
BindingTraceContext bindingTraceContext = new BindingTraceContext();
|
||||||
BindingContext bindingContext = bootstrappingTDA.process(JetStandardClasses.STANDARD_CLASSES, file.getRootNamespace().getDeclarations());
|
TopDownAnalyzer bootstrappingTDA = new TopDownAnalyzer(bootstrappingSemanticServices, bindingTraceContext);
|
||||||
|
bootstrappingTDA.process(JetStandardClasses.STANDARD_CLASSES, file.getRootNamespace().getDeclarations());
|
||||||
|
BindingContext bindingContext = bindingTraceContext;
|
||||||
|
|
||||||
this.libraryScope = bindingContext.getTopLevelScope();
|
this.libraryScope = bindingContext.getTopLevelScope();
|
||||||
|
|
||||||
this.byteClass = libraryScope.getClass("Byte");
|
this.byteClass = libraryScope.getClass("Byte");
|
||||||
|
|||||||
@@ -49,13 +49,21 @@ public class JetTypeInferrer {
|
|||||||
public void visitReferenceExpression(JetReferenceExpression expression) {
|
public void visitReferenceExpression(JetReferenceExpression expression) {
|
||||||
// TODO : other members
|
// TODO : other members
|
||||||
// TODO : type substitutions???
|
// TODO : type substitutions???
|
||||||
PropertyDescriptor property = scope.getProperty(expression.getReferencedName());
|
String referencedName = expression.getReferencedName();
|
||||||
|
PropertyDescriptor property = scope.getProperty(referencedName);
|
||||||
if (property != null) {
|
if (property != null) {
|
||||||
trace.recordReferenceResolution(expression, property);
|
trace.recordReferenceResolution(expression, property);
|
||||||
result[0] = property.getType();
|
result[0] = property.getType();
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
semanticServices.getErrorHandler().unresolvedReference(expression);
|
NamespaceDescriptor namespace = scope.getNamespace(referencedName);
|
||||||
|
if (namespace != null) {
|
||||||
|
trace.recordReferenceResolution(expression, namespace);
|
||||||
|
result[0] = namespace.getNamespaceType();
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
semanticServices.getErrorHandler().unresolvedReference(expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -275,8 +283,10 @@ public class JetTypeInferrer {
|
|||||||
JetExpression receiverExpression = expression.getReceiverExpression();
|
JetExpression receiverExpression = expression.getReceiverExpression();
|
||||||
JetExpression selectorExpression = expression.getSelectorExpression();
|
JetExpression selectorExpression = expression.getSelectorExpression();
|
||||||
Type receiverType = getType(scope, receiverExpression, false);
|
Type receiverType = getType(scope, receiverExpression, false);
|
||||||
JetScope compositeScope = new ScopeWithReceiver(scope, receiverType);
|
if (receiverType != null) { // TODO : review
|
||||||
result[0] = getType(compositeScope, selectorExpression, false);
|
JetScope compositeScope = new ScopeWithReceiver(scope, receiverType);
|
||||||
|
result[0] = getType(compositeScope, selectorExpression, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -439,7 +449,7 @@ public class JetTypeInferrer {
|
|||||||
return getType(scope, expression, true);
|
return getType(scope, expression, true);
|
||||||
}
|
}
|
||||||
// TODO: functions, classes, etc.
|
// TODO: functions, classes, etc.
|
||||||
throw new IllegalArgumentException("Last item in the block must be an expression");
|
throw new IllegalArgumentException("Last item in the block must be an expression, but was " + lastElement.getClass().getCanonicalName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package org.jetbrains.jet.lang.types;
|
package org.jetbrains.jet.lang.types;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.resolve.ResolveUtil;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -26,7 +25,6 @@ public class LazySubstitutingFunctionDescriptor implements FunctionDescriptor {
|
|||||||
for (TypeParameterDescriptor parameterDescriptor : functionDescriptor.getTypeParameters()) {
|
for (TypeParameterDescriptor parameterDescriptor : functionDescriptor.getTypeParameters()) {
|
||||||
// TODO : lazy?
|
// TODO : lazy?
|
||||||
result.add(new TypeParameterDescriptor(
|
result.add(new TypeParameterDescriptor(
|
||||||
ResolveUtil.getJetTypeParameter(parameterDescriptor),
|
|
||||||
parameterDescriptor.getAttributes(),
|
parameterDescriptor.getAttributes(),
|
||||||
parameterDescriptor.getVariance(),
|
parameterDescriptor.getVariance(),
|
||||||
parameterDescriptor.getName(),
|
parameterDescriptor.getName(),
|
||||||
@@ -39,9 +37,11 @@ public class LazySubstitutingFunctionDescriptor implements FunctionDescriptor {
|
|||||||
@Override
|
@Override
|
||||||
public List<ValueParameterDescriptor> getUnsubstitutedValueParameters() {
|
public List<ValueParameterDescriptor> getUnsubstitutedValueParameters() {
|
||||||
List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
|
List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
|
||||||
for (ValueParameterDescriptor parameterDescriptor : functionDescriptor.getUnsubstitutedValueParameters()) {
|
List<ValueParameterDescriptor> unsubstitutedValueParameters = functionDescriptor.getUnsubstitutedValueParameters();
|
||||||
|
for (int i = 0, unsubstitutedValueParametersSize = unsubstitutedValueParameters.size(); i < unsubstitutedValueParametersSize; i++) {
|
||||||
|
ValueParameterDescriptor parameterDescriptor = unsubstitutedValueParameters.get(i);
|
||||||
result.add(new ValueParameterDescriptorImpl(
|
result.add(new ValueParameterDescriptorImpl(
|
||||||
ResolveUtil.getJetParameter(parameterDescriptor),
|
i,
|
||||||
parameterDescriptor.getAttributes(),
|
parameterDescriptor.getAttributes(),
|
||||||
parameterDescriptor.getName(),
|
parameterDescriptor.getName(),
|
||||||
TypeSubstitutor.INSTANCE.substitute(substitutionContext, parameterDescriptor.getType(), Variance.IN_VARIANCE),
|
TypeSubstitutor.INSTANCE.substitute(substitutionContext, parameterDescriptor.getType(), Variance.IN_VARIANCE),
|
||||||
|
|||||||
@@ -1,31 +1,29 @@
|
|||||||
package org.jetbrains.jet.lang.types;
|
package org.jetbrains.jet.lang.types;
|
||||||
|
|
||||||
import org.jetbrains.jet.lang.modules.NamespaceDomain;
|
import org.jetbrains.jet.lang.resolve.JetScope;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
*/
|
*/
|
||||||
public class NamespaceDescriptor implements NamespaceDomain {
|
public class NamespaceDescriptor extends DeclarationDescriptorImpl {
|
||||||
public ClassDescriptor getClass(String name) {
|
private NamespaceType namespaceType;
|
||||||
throw new UnsupportedOperationException(); // TODO
|
private final JetScope memberScope;
|
||||||
|
|
||||||
|
public NamespaceDescriptor(List<Attribute> attributes, String name, JetScope memberScope) {
|
||||||
|
super(attributes, name);
|
||||||
|
this.memberScope = memberScope;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<FunctionDescriptor> getMethods(String name) {
|
public JetScope getMemberScope() {
|
||||||
throw new UnsupportedOperationException(); // TODO
|
return memberScope;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PropertyDescriptor getProperty(String name) {
|
public NamespaceType getNamespaceType() {
|
||||||
throw new UnsupportedOperationException(); // TODO
|
if (namespaceType == null) {
|
||||||
}
|
namespaceType = new NamespaceType(getName(), memberScope);
|
||||||
|
}
|
||||||
public ExtensionDescriptor getExtension(String name) {
|
return namespaceType;
|
||||||
throw new UnsupportedOperationException(); // TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NamespaceDescriptor getNamespace(String namespaceName) {
|
|
||||||
throw new UnsupportedOperationException(); // TODO
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
package org.jetbrains.jet.lang.types;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.jet.lang.resolve.JetScope;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a fake type assigned to namespace expressions. Only member lookup is
|
||||||
|
* supposed to be done on these types.
|
||||||
|
*
|
||||||
|
* @author abreslav
|
||||||
|
*/
|
||||||
|
public class NamespaceType implements Type {
|
||||||
|
private final String name;
|
||||||
|
private final JetScope memberScope;
|
||||||
|
|
||||||
|
public NamespaceType(String name, JetScope memberScope) {
|
||||||
|
this.name = name;
|
||||||
|
this.memberScope = memberScope;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public JetScope getMemberScope() {
|
||||||
|
return memberScope;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public TypeConstructor getConstructor() {
|
||||||
|
return throwException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private TypeConstructor throwException() {
|
||||||
|
throw new UnsupportedOperationException("Only member lookup is allowed on a namespace type " + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public List<TypeProjection> getArguments() {
|
||||||
|
throwException();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNullable() {
|
||||||
|
throwException();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Attribute> getAttributes() {
|
||||||
|
throwException();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,18 +1,15 @@
|
|||||||
package org.jetbrains.jet.lang.types;
|
package org.jetbrains.jet.lang.types;
|
||||||
|
|
||||||
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
|
||||||
import org.jetbrains.jet.lang.psi.JetProperty;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
*/
|
*/
|
||||||
public class PropertyDescriptorImpl extends DeclarationDescriptorImpl<JetDeclaration> implements PropertyDescriptor {
|
public class PropertyDescriptorImpl extends DeclarationDescriptorImpl implements PropertyDescriptor {
|
||||||
private Type type;
|
private Type type;
|
||||||
|
|
||||||
public PropertyDescriptorImpl(JetDeclaration psiElement, List<Attribute> attributes, String name, Type type) {
|
public PropertyDescriptorImpl(List<Attribute> attributes, String name, Type type) {
|
||||||
super(psiElement, attributes, name);
|
super(attributes, name);
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,4 +37,5 @@ public class TypeConstructor extends AnnotatedImpl {
|
|||||||
public boolean isSealed() {
|
public boolean isSealed() {
|
||||||
return sealed;
|
return sealed;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public final class TypeImpl extends AnnotatedImpl implements Type {
|
|||||||
this(Collections.<Attribute>emptyList(), constructor, false, Collections.<TypeProjection>emptyList(), memberScope);
|
this(Collections.<Attribute>emptyList(), constructor, false, Collections.<TypeProjection>emptyList(), memberScope);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TypeImpl(ClassDescriptor classDescriptor) {
|
public TypeImpl(@NotNull ClassDescriptor classDescriptor) {
|
||||||
this(Collections.<Attribute>emptyList(),
|
this(Collections.<Attribute>emptyList(),
|
||||||
classDescriptor.getTypeConstructor(),
|
classDescriptor.getTypeConstructor(),
|
||||||
false,
|
false,
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
package org.jetbrains.jet.lang.types;
|
package org.jetbrains.jet.lang.types;
|
||||||
|
|
||||||
import org.jetbrains.jet.lang.psi.JetTypeParameter;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -9,13 +7,13 @@ import java.util.Set;
|
|||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
*/
|
*/
|
||||||
public class TypeParameterDescriptor extends DeclarationDescriptorImpl<JetTypeParameter> {
|
public class TypeParameterDescriptor extends DeclarationDescriptorImpl {
|
||||||
private final Variance variance;
|
private final Variance variance;
|
||||||
private final Set<Type> upperBounds;
|
private final Set<Type> upperBounds;
|
||||||
private final TypeConstructor typeConstructor;
|
private final TypeConstructor typeConstructor;
|
||||||
|
|
||||||
public TypeParameterDescriptor(JetTypeParameter psiElement, List<Attribute> attributes, Variance variance, String name, Set<Type> upperBounds) {
|
public TypeParameterDescriptor(List<Attribute> attributes, Variance variance, String name, Set<Type> upperBounds) {
|
||||||
super(psiElement, attributes, name);
|
super(attributes, name);
|
||||||
this.variance = variance;
|
this.variance = variance;
|
||||||
this.upperBounds = upperBounds;
|
this.upperBounds = upperBounds;
|
||||||
// TODO: Should we actually pass the attributes on to the type constructor?
|
// TODO: Should we actually pass the attributes on to the type constructor?
|
||||||
@@ -28,7 +26,7 @@ public class TypeParameterDescriptor extends DeclarationDescriptorImpl<JetTypePa
|
|||||||
}
|
}
|
||||||
|
|
||||||
public TypeParameterDescriptor(List<Attribute> attributes, Variance variance, String name) {
|
public TypeParameterDescriptor(List<Attribute> attributes, Variance variance, String name) {
|
||||||
this(null, attributes, variance, name, Collections.singleton(JetStandardClasses.getNullableAnyType()));
|
this(attributes, variance, name, Collections.singleton(JetStandardClasses.getNullableAnyType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Variance getVariance() {
|
public Variance getVariance() {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package org.jetbrains.jet.lang.types;
|
|||||||
|
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
import org.jetbrains.jet.lang.psi.JetDeclaration;
|
||||||
import org.jetbrains.jet.lang.psi.JetParameter;
|
|
||||||
import org.jetbrains.jet.lang.psi.JetParameterList;
|
import org.jetbrains.jet.lang.psi.JetParameterList;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -13,21 +12,24 @@ import java.util.List;
|
|||||||
public class ValueParameterDescriptorImpl extends PropertyDescriptorImpl implements ValueParameterDescriptor {
|
public class ValueParameterDescriptorImpl extends PropertyDescriptorImpl implements ValueParameterDescriptor {
|
||||||
private final boolean hasDefaultValue;
|
private final boolean hasDefaultValue;
|
||||||
private final boolean isVararg;
|
private final boolean isVararg;
|
||||||
|
private final int index;
|
||||||
|
|
||||||
public ValueParameterDescriptorImpl(JetParameter psiElement, List<Attribute> attributes, String name, Type type, boolean hasDefaultValue, boolean isVararg) {
|
public ValueParameterDescriptorImpl(int index, List<Attribute> attributes, String name, Type type, boolean hasDefaultValue, boolean isVararg) {
|
||||||
super(psiElement, attributes, name, type);
|
super(attributes, name, type);
|
||||||
|
this.index = index;
|
||||||
this.hasDefaultValue = hasDefaultValue;
|
this.hasDefaultValue = hasDefaultValue;
|
||||||
this.isVararg = isVararg;
|
this.isVararg = isVararg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getIndex() {
|
public int getIndex() {
|
||||||
final JetDeclaration element = getPsiElement();
|
return index;
|
||||||
final PsiElement parent = element.getParent();
|
// final JetDeclaration element = getPsiElement();
|
||||||
if (parent instanceof JetParameterList) {
|
// final PsiElement parent = element.getParent();
|
||||||
return ((JetParameterList) parent).getParameters().indexOf(element);
|
// if (parent instanceof JetParameterList) {
|
||||||
}
|
// return ((JetParameterList) parent).getParameters().indexOf(element);
|
||||||
throw new IllegalStateException("couldn't find index for parameter");
|
// }
|
||||||
|
// throw new IllegalStateException("couldn't find index for parameter");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase {
|
|||||||
StringWriter writer = new StringWriter();
|
StringWriter writer = new StringWriter();
|
||||||
JetFile jetFile = (JetFile) myFixture.getFile();
|
JetFile jetFile = (JetFile) myFixture.getFile();
|
||||||
JetNamespace namespace = jetFile.getRootNamespace();
|
JetNamespace namespace = jetFile.getRootNamespace();
|
||||||
codegen.generate(namespace, new TraceClassVisitor(new PrintWriter(writer)), JetSemanticServices.createSemanticServices(getProject(), ErrorHandler.THROW_EXCEPTION));
|
codegen.generate(namespace, new TraceClassVisitor(new PrintWriter(writer)), getProject());
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase {
|
|||||||
JetFile jetFile = (JetFile) myFixture.getFile();
|
JetFile jetFile = (JetFile) myFixture.getFile();
|
||||||
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
|
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
|
||||||
final JetNamespace namespace = jetFile.getRootNamespace();
|
final JetNamespace namespace = jetFile.getRootNamespace();
|
||||||
codegen.generate(namespace, writer, JetSemanticServices.createSemanticServices(getProject(), ErrorHandler.THROW_EXCEPTION));
|
codegen.generate(namespace, writer, getProject());
|
||||||
final byte[] data = writer.toByteArray();
|
final byte[] data = writer.toByteArray();
|
||||||
MyClassLoader classLoader = new MyClassLoader(NamespaceGenTest.class.getClassLoader());
|
MyClassLoader classLoader = new MyClassLoader(NamespaceGenTest.class.getClassLoader());
|
||||||
final Class aClass = classLoader.doDefineClass(NamespaceCodegen.getJVMClassName(namespace).replace("/", "."), data);
|
final Class aClass = classLoader.doDefineClass(NamespaceCodegen.getJVMClassName(namespace).replace("/", "."), data);
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import org.jetbrains.jet.lang.ErrorHandler;
|
|||||||
import org.jetbrains.jet.lang.JetSemanticServices;
|
import org.jetbrains.jet.lang.JetSemanticServices;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
|
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
|
||||||
import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
|
import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
|
||||||
import org.jetbrains.jet.lang.types.*;
|
import org.jetbrains.jet.lang.types.*;
|
||||||
|
|
||||||
@@ -76,8 +77,10 @@ public class ExpectedResolveData {
|
|||||||
Map<String, DeclarationDescriptor> nameToDescriptor = new HashMap<String, DeclarationDescriptor>();
|
Map<String, DeclarationDescriptor> nameToDescriptor = new HashMap<String, DeclarationDescriptor>();
|
||||||
nameToDescriptor.put("std::Int.plus(Int)", standardFunction(lib.getInt(), "plus", lib.getIntType()));
|
nameToDescriptor.put("std::Int.plus(Int)", standardFunction(lib.getInt(), "plus", lib.getIntType()));
|
||||||
|
|
||||||
TopDownAnalyzer topDownAnalyzer = new TopDownAnalyzer(semanticServices);
|
BindingTraceContext bindingTraceContext = new BindingTraceContext();
|
||||||
BindingContext bindingContext = topDownAnalyzer.process(lib.getLibraryScope(), file.getRootNamespace().getDeclarations());
|
TopDownAnalyzer topDownAnalyzer = new TopDownAnalyzer(semanticServices, bindingTraceContext);
|
||||||
|
topDownAnalyzer.process(lib.getLibraryScope(), file.getRootNamespace().getDeclarations());
|
||||||
|
BindingContext bindingContext = bindingTraceContext;
|
||||||
|
|
||||||
Map<String, JetDeclaration> nameToDeclaration = new HashMap<String, JetDeclaration>();
|
Map<String, JetDeclaration> nameToDeclaration = new HashMap<String, JetDeclaration>();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user