Skip to content

Commit

Permalink
Refactor ClassDeclaration because not all classes have parameter lists
Browse files Browse the repository at this point in the history
* Add ClassDeclaration.defaultConstructor, refined to be non-optional
  on ClassWithInitialiserDeclaration.
* Make parameterDeclarations optional on ClassDeclaration, refined to be non-optional
  on ClassWithInitialiserDeclaration.
* Fix doc on getParameterDeclaration() to clarify it will always return
  null on classes with neither parameter list nor default constructor.
* Add a test for these things
* Fix a couple of broken tests

Part of #750
  • Loading branch information
tombentley committed Oct 9, 2015
1 parent a9810a6 commit 5f2580b
Show file tree
Hide file tree
Showing 11 changed files with 599 additions and 58 deletions.
Expand Up @@ -3,19 +3,6 @@
import java.lang.reflect.AnnotatedElement;
import java.util.List;

import com.redhat.ceylon.compiler.java.Util;
import com.redhat.ceylon.compiler.java.metadata.Ceylon;
import com.redhat.ceylon.compiler.java.metadata.Ignore;
import com.redhat.ceylon.compiler.java.metadata.Name;
import com.redhat.ceylon.compiler.java.metadata.TypeInfo;
import com.redhat.ceylon.compiler.java.metadata.TypeParameter;
import com.redhat.ceylon.compiler.java.metadata.TypeParameters;
import com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor;
import com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor.Nothing;
import com.redhat.ceylon.model.typechecker.model.Class;
import com.redhat.ceylon.model.typechecker.model.Constructor;
import com.redhat.ceylon.model.typechecker.model.Generic;

import ceylon.language.Anything;
import ceylon.language.Iterator;
import ceylon.language.Sequential;
Expand All @@ -33,6 +20,19 @@
import ceylon.language.meta.model.MemberClassCallableConstructor;
import ceylon.language.meta.model.Type;

import com.redhat.ceylon.compiler.java.Util;
import com.redhat.ceylon.compiler.java.metadata.Ceylon;
import com.redhat.ceylon.compiler.java.metadata.Ignore;
import com.redhat.ceylon.compiler.java.metadata.Name;
import com.redhat.ceylon.compiler.java.metadata.TypeInfo;
import com.redhat.ceylon.compiler.java.metadata.TypeParameter;
import com.redhat.ceylon.compiler.java.metadata.TypeParameters;
import com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor;
import com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor.Nothing;
import com.redhat.ceylon.model.typechecker.model.Class;
import com.redhat.ceylon.model.typechecker.model.Constructor;
import com.redhat.ceylon.model.typechecker.model.Generic;

@Ceylon(major = 8)
@com.redhat.ceylon.compiler.java.metadata.Class
public class FreeCallableConstructor
Expand All @@ -41,8 +41,6 @@ public class FreeCallableConstructor
ceylon.language.meta.declaration.FunctionalDeclaration,
AnnotationBearing {

private OpenType type;

@Ignore
public static final TypeDescriptor $TypeDescriptor$ = TypeDescriptor.klass(FreeCallableConstructor.class);

Expand Down
Expand Up @@ -5,6 +5,14 @@
import java.util.LinkedList;
import java.util.List;

import ceylon.language.Anything;
import ceylon.language.Sequential;
import ceylon.language.empty_;
import ceylon.language.meta.declaration.CallableConstructorDeclaration;
import ceylon.language.meta.declaration.ClassDeclaration$impl;
import ceylon.language.meta.declaration.ValueConstructorDeclaration;
import ceylon.language.meta.declaration.ValueDeclaration;

import com.redhat.ceylon.compiler.java.language.ObjectArrayIterable;
import com.redhat.ceylon.compiler.java.metadata.Ceylon;
import com.redhat.ceylon.compiler.java.metadata.Defaulted;
Expand All @@ -22,18 +30,9 @@
import com.redhat.ceylon.model.typechecker.model.Declaration;
import com.redhat.ceylon.model.typechecker.model.ParameterList;

import ceylon.language.Anything;
import ceylon.language.Sequential;
import ceylon.language.empty_;
import ceylon.language.meta.declaration.CallableConstructorDeclaration;
import ceylon.language.meta.declaration.ClassDeclaration$impl;
import ceylon.language.meta.declaration.FunctionOrValueDeclaration;
import ceylon.language.meta.declaration.ValueConstructorDeclaration;
import ceylon.language.meta.declaration.ValueDeclaration;

@Ceylon(major = 8)
@com.redhat.ceylon.compiler.java.metadata.Class
public class FreeClass
public abstract class FreeClass
extends FreeClassOrInterface
implements ceylon.language.meta.declaration.ClassDeclaration {

Expand Down Expand Up @@ -65,10 +64,10 @@ protected void init() {
if (parameterList != null) {
this.parameters = FunctionalUtil.getParameters(classDeclaration);
} else {
this.parameters = (Sequential<? extends FunctionOrValueDeclaration>) (Sequential)empty_.get_();
this.parameters = null;
}
}else{
this.parameters = (Sequential<? extends FunctionOrValueDeclaration>) (Sequential)empty_.get_();
this.parameters = null;
}
if (((Class)declaration).hasConstructors()
||((Class)declaration).hasEnumerated()) {
Expand Down Expand Up @@ -131,17 +130,21 @@ public boolean getFinal() {
}

@Override
@TypeInfo("ceylon.language::Sequential<ceylon.language.meta.declaration::FunctionOrValueDeclaration>")
@TypeInfo("ceylon.language.meta.declaration::FunctionOrValueDeclaration[]?")
public Sequential<? extends ceylon.language.meta.declaration.FunctionOrValueDeclaration> getParameterDeclarations(){
checkInit();
return parameters;
return this.parameters;
}

@Override
@TypeInfo("ceylon.language.meta.declaration::FunctionOrValueDeclaration|ceylon.language::Null")
public ceylon.language.meta.declaration.FunctionOrValueDeclaration getParameterDeclaration(@Name("name") String name){
checkInit();
return FunctionalUtil.getParameterDeclaration(this.parameters, name);
if (this.parameters == null) {
return null;
} else {
return FunctionalUtil.getParameterDeclaration(this.parameters, name);
}
}

@SuppressWarnings({ "unchecked", "rawtypes" })
Expand Down
@@ -1,5 +1,7 @@
package com.redhat.ceylon.compiler.java.runtime.metamodel;

import ceylon.language.meta.declaration.CallableConstructorDeclaration;

import com.redhat.ceylon.compiler.java.metadata.Ceylon;
import com.redhat.ceylon.compiler.java.metadata.Ignore;
import com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor;
Expand Down Expand Up @@ -30,4 +32,9 @@ public FreeClassWithConstructors(com.redhat.ceylon.model.typechecker.model.Class
return $TypeDescriptor$;
}

@Override
public CallableConstructorDeclaration getDefaultConstructor() {
return (CallableConstructorDeclaration)getConstructorDeclaration("");
}

}
@@ -1,13 +1,21 @@
package com.redhat.ceylon.compiler.java.runtime.metamodel;

import java.util.List;

import ceylon.language.Sequential;
import ceylon.language.Singleton;
import ceylon.language.empty_;
import ceylon.language.meta.declaration.CallableConstructorDeclaration;
import ceylon.language.meta.declaration.ConstructorDeclaration;
import ceylon.language.meta.declaration.FunctionOrValueDeclaration;

import com.redhat.ceylon.compiler.java.metadata.Ceylon;
import com.redhat.ceylon.compiler.java.metadata.Ignore;
import com.redhat.ceylon.compiler.java.metadata.Name;
import com.redhat.ceylon.compiler.java.metadata.TypeInfo;
import com.redhat.ceylon.compiler.java.runtime.model.TypeDescriptor;
import com.redhat.ceylon.model.typechecker.model.Declaration;
import com.redhat.ceylon.model.typechecker.model.ParameterList;

@Ceylon(major = 8)
@com.redhat.ceylon.compiler.java.metadata.Class
Expand Down Expand Up @@ -35,16 +43,33 @@ public FreeClassWithInitializer(com.redhat.ceylon.model.typechecker.model.Class
return $TypeDescriptor$;
}

@TypeInfo("ceylon.language::Empty")
@TypeInfo("ceylon.language::ConstructorDeclaration[]")
@Override
public Sequential<? extends ConstructorDeclaration> constructorDeclarations() {
return (Sequential)empty_.get_();
return new Singleton<ConstructorDeclaration>(ConstructorDeclaration.$TypeDescriptor$, getDefaultConstructor());
}

@TypeInfo("ceylon.language::Empty")
@TypeInfo("ceylon.language::ConstructorDeclaration[]")
@Override
public <A extends java.lang.annotation.Annotation> Sequential<? extends ConstructorDeclaration> annotatedConstructorDeclarations(TypeDescriptor reified$Annotation) {
// TODO test the single ctor against the preditace and return a singleton or not
return (Sequential)empty_.get_();
}

public CallableConstructorDeclaration getDefaultConstructor() {
return new FreeInitializerConstructor((com.redhat.ceylon.model.typechecker.model.Class)declaration);
}

@Override
@TypeInfo("ceylon.language::Sequential<ceylon.language.meta.declaration::FunctionOrValueDeclaration>")
public Sequential<? extends ceylon.language.meta.declaration.FunctionOrValueDeclaration> getParameterDeclarations(){
return super.getParameterDeclarations();
}

@Override
@TypeInfo("ceylon.language.meta.declaration::FunctionOrValueDeclaration|ceylon.language::Null")
public ceylon.language.meta.declaration.FunctionOrValueDeclaration getParameterDeclaration(@Name("name") String name){
return super.getParameterDeclaration(name);
}

}

0 comments on commit 5f2580b

Please sign in to comment.