From 31d55a43eb126005e1be2396b86dcf6acdc00455 Mon Sep 17 00:00:00 2001 From: Stephane Epardaud Date: Tue, 16 Jul 2013 15:02:59 +0200 Subject: [PATCH] metamodel #226: fixed more missing type descriptors --- .../java/runtime/metamodel/AppliedAttribute.java | 2 +- .../java/runtime/metamodel/AppliedValue.java | 2 +- .../java/runtime/metamodel/FreeAttribute.java | 6 ++++-- .../metamodel/FreeAttributeWithAppliedValue.java | 2 +- .../runtime/metamodel/FreeClassOrInterface.java | 15 ++++++++------- .../FreeVariableWithAppliedVariable.java | 11 ++++++----- .../java/runtime/metamodel/Metamodel.java | 2 +- 7 files changed, 22 insertions(+), 18 deletions(-) diff --git a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/AppliedAttribute.java b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/AppliedAttribute.java index 56d5ed2fe..904501e77 100644 --- a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/AppliedAttribute.java +++ b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/AppliedAttribute.java @@ -77,7 +77,7 @@ public ceylon.language.metamodel.Type getType() { @Override protected Value bindTo(Object instance) { - return new AppliedValue(null, declaration, type, instance); + return new AppliedValue($reifiedType, declaration, type, instance); } @Override diff --git a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/AppliedValue.java b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/AppliedValue.java index e2aa4ca4c..447592cd1 100644 --- a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/AppliedValue.java +++ b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/AppliedValue.java @@ -41,7 +41,7 @@ public class AppliedValue public AppliedValue(@Ignore TypeDescriptor $reifiedType, FreeAttribute value, ProducedType valueType, Object instance) { this.type = Metamodel.getAppliedMetamodel(valueType); - this.$reifiedType = Metamodel.getTypeDescriptorForProducedType(valueType); + this.$reifiedType = $reifiedType; this.declaration = value; initField(instance, valueType); diff --git a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeAttribute.java b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeAttribute.java index b8752c08b..35b6ac0ab 100644 --- a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeAttribute.java +++ b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeAttribute.java @@ -61,9 +61,11 @@ public ceylon.language.metamodel.Value apply() { public ceylon.language.metamodel.Value apply(@Name @TypeInfo("ceylon.language::Anything") Object instance) { // FIXME: validate that instance is null for toplevels and not null for memberss com.redhat.ceylon.compiler.typechecker.model.Value modelDecl = (com.redhat.ceylon.compiler.typechecker.model.Value)declaration; + // FIXME: this is not valid if the container type has TP + TypeDescriptor reifiedType = Metamodel.getTypeDescriptorForProducedType(modelDecl.getType()); return modelDecl.isVariable() - ? new AppliedVariable(null, this, modelDecl.getType(), instance) - : new AppliedValue(null, this, modelDecl.getType(), instance); + ? new AppliedVariable(reifiedType, this, modelDecl.getType(), instance) + : new AppliedValue(reifiedType, this, modelDecl.getType(), instance); } @Override diff --git a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeAttributeWithAppliedValue.java b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeAttributeWithAppliedValue.java index d6e0ca708..5276bec64 100644 --- a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeAttributeWithAppliedValue.java +++ b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeAttributeWithAppliedValue.java @@ -31,7 +31,7 @@ protected FreeAttributeWithAppliedValue(@Ignore TypeDescriptor $reifiedType, Typ super(declaration); com.redhat.ceylon.compiler.typechecker.model.Value modelDecl = (com.redhat.ceylon.compiler.typechecker.model.Value)declaration; // FIXME: container? - typeDelegate = new AppliedValue(null, this, modelDecl.getType(), null); + typeDelegate = new AppliedValue($reifiedType, this, modelDecl.getType(), null); } @Override diff --git a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeClassOrInterface.java b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeClassOrInterface.java index 03dcbf190..091e9209e 100644 --- a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeClassOrInterface.java +++ b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeClassOrInterface.java @@ -147,7 +147,7 @@ protected final void checkInit(){ } private Sequential filteredMembers( - TypeDescriptor $reifiedKind, + @Ignore TypeDescriptor $reifiedKind, Predicates.Predicate predicate) { if (predicate == Predicates.false_()) { return (Sequential)empty_.$get(); @@ -163,7 +163,7 @@ private Sequential filteredMembers( } private Kind filteredMember( - TypeDescriptor $reifiedKind, + @Ignore TypeDescriptor $reifiedKind, Predicates.Predicate predicate) { if (predicate == Predicates.false_()) { return null; @@ -266,7 +266,8 @@ ceylon.language.metamodel.Member memberApply( } > - ceylon.language.metamodel.Member getAppliedClassOrInterface(TypeDescriptor $reifiedType, TypeDescriptor $reifiedKind, + ceylon.language.metamodel.Member getAppliedClassOrInterface(@Ignore TypeDescriptor $reifiedType, + @Ignore TypeDescriptor $reifiedKind, Sequential types, AppliedClassOrInterface container){ List producedTypes = Metamodel.getProducedTypes(types); @@ -289,19 +290,19 @@ ceylon.language.metamodel.Member getAppliedClassOrInterface(TypeDesc } FreeFunction findMethod(String name) { - return this.findDeclaration(name); + return this.findDeclaration(null, name); } FreeAttribute findValue(String name) { - return this.findDeclaration(name); + return this.findDeclaration(null, name); } FreeClassOrInterface findType(String name) { - return this.findDeclaration(name); + return this.findDeclaration(null, name); } - T findDeclaration(String name) { + T findDeclaration(@Ignore TypeDescriptor $reifiedT, String name) { checkInit(); for(ceylon.language.metamodel.declaration.TopLevelOrMemberDeclaration decl : declarations){ // in theory we can't have several members with the same name so no need to check the type diff --git a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeVariableWithAppliedVariable.java b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeVariableWithAppliedVariable.java index 586183be2..e6f732a8f 100644 --- a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeVariableWithAppliedVariable.java +++ b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/FreeVariableWithAppliedVariable.java @@ -27,11 +27,14 @@ public class FreeVariableWithAppliedVariable implements Variable { private AppliedVariable typeDelegate; + @Ignore + private TypeDescriptor $reifiedType; - protected FreeVariableWithAppliedVariable(com.redhat.ceylon.compiler.typechecker.model.Value declaration) { + protected FreeVariableWithAppliedVariable(@Ignore TypeDescriptor $reifiedType, com.redhat.ceylon.compiler.typechecker.model.Value declaration) { super(declaration); + this.$reifiedType = $reifiedType; // FIXME: container? - typeDelegate = new AppliedVariable(null, this, declaration.getType(), null); + typeDelegate = new AppliedVariable($reifiedType, this, declaration.getType(), null); } @Override @@ -92,8 +95,6 @@ public Value apply(@Name @TypeInfo("ceylon.language::Anything" @Override public TypeDescriptor $getType() { - TypeDescriptor.Class type = (TypeDescriptor.Class) typeDelegate.$getType(); - TypeDescriptor[] args = type.getTypeArguments(); - return TypeDescriptor.klass(FreeVariableWithAppliedVariable.class, args[0]); + return TypeDescriptor.klass(FreeVariableWithAppliedVariable.class, $reifiedType); } } diff --git a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/Metamodel.java b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/Metamodel.java index 88ce421af..39081c79e 100644 --- a/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/Metamodel.java +++ b/runtime/com/redhat/ceylon/compiler/java/runtime/metamodel/Metamodel.java @@ -203,7 +203,7 @@ public static com.redhat.ceylon.compiler.java.runtime.metamodel.FreeTopLevelOrMe TypeDescriptor reifiedType = getTypeDescriptorForProducedType(value.getType()); if(value.isToplevel()){ if(value.isVariable()) - ret = new FreeVariableWithAppliedVariable(value); + ret = new FreeVariableWithAppliedVariable(reifiedType, value); else ret = new FreeAttributeWithAppliedValue(reifiedType, value); }else{