History | Log In     View a printable version of the current page.  
Issue Details (XML | Word | Printable)

Key: BOO-935
Type: Improvement Improvement
Status: In Progress In Progress
Priority: Major Major
Assignee: Avishay Lavie
Reporter: Avishay Lavie
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Boo

Declaring constraints on generic type parameters

Created: 04/Jan/08 04:26 PM   Updated: 15/Jun/08 01:54 PM
Component/s: Compiler
Affects Version/s: 0.8
Fix Version/s: None

Time Tracking:
Not Specified

Issue Links:
Related
 
dependent
 


 Description  « Hide
The ability to declare constraints on generic type parameters for generic types and methods.
These include base-type constraints, default constructor constraints, and struct/class constraints.

 All   Comments   Work Log   Change History      Sort Order: Ascending order - Click to sort in descending order
Avishay Lavie - 06/Jun/08 04:26 PM
Partially implemented as of revision 2996.

Greg Nagel - 15/Jun/08 01:29 PM
I ran against a couple constraint bugs in SVN, but didn't want to report them separately, as constraints aren't quite finished. I have a couple test cases that fail for some odd reason.

This first case fails only if A is defined after Z. It doesn't matter if you use an intermediate class (as shown in the second block).

class B(A):
	pass
class Z[of T(A)]():
	pass	
class A:
	pass
Z[of B]()
class Z[of T(A)]():
	pass	
class A:
	pass
Z[of A]()

Here's the error:

BCE0011: Boo.Lang.Compiler.CompilerError: An error occurred during the execution of the step 'Boo.Lang.Compiler.Steps.Em
itAssembly': 'Could not find a Type for A.'. ---> System.InvalidOperationException: Could not find a Type for A.
at Boo.Lang.Compiler.Steps.EmitAssembly.GetSystemType(IType tag) in c:\code\svnboo\src\Boo.Lang.Compiler\Steps\EmitAs
sembly.cs:line 4096
at Boo.Lang.Compiler.Steps.EmitAssembly.DefineGenericParameter(InternalGenericParameter parameter, GenericTypeParamet
erBuilder builder) in c:\code\svnboo\src\Boo.Lang.Compiler\Steps\EmitAssembly.cs:line 4503
at Boo.Lang.Compiler.Steps.EmitAssembly.DefineGenericParameters(GenericTypeParameterBuilder[] builders, GenericParame
terDeclaration[] declarations) in c:\code\svnboo\src\Boo.Lang.Compiler\Steps\EmitAssembly.cs:line 4494
at Boo.Lang.Compiler.Steps.EmitAssembly.DefineGenericParameters(TypeBuilder builder, GenericParameterDeclaration[] pa
rameters) in c:\code\svnboo\src\Boo.Lang.Compiler\Steps\EmitAssembly.cs:line 4472
at Boo.Lang.Compiler.Steps.EmitAssembly.DefineType(TypeDefinition typeDefinition) in c:\code\svnboo\src\Boo.Lang.Comp
iler\Steps\EmitAssembly.cs:line 4553
at Boo.Lang.Compiler.Steps.EmitAssembly.DefineTypes() in c:\code\svnboo\src\Boo.Lang.Compiler\Steps\EmitAssembly.cs:l
ine 218
at Boo.Lang.Compiler.Steps.EmitAssembly.Run() in c:\code\svnboo\src\Boo.Lang.Compiler\Steps\EmitAssembly.cs:line 192
at Boo.Lang.Compiler.CompilerPipeline.RunStep(CompilerContext context, ICompilerStep step) in c:\code\svnboo\src\Boo.
Lang.Compiler\CompilerPipeline.cs:line 311
— End of inner exception stack trace —


Greg Nagel - 15/Jun/08 01:31 PM
Secondly, the constructor constraint doesn't appear to work correctly when used. It fails with an odd message:
class A:
	pass
class B[of T(constructor)]:
	pass	
x as B[of A]

test2.boo(1,7): BCE0015: Boo.Lang.Compiler.CompilerError: Node 'A.constructor' has not been correctly processed.
at Boo.Lang.Compiler.TypeSystem.TypeSystemServices.InvalidNode(Node node) in c:\code\svnboo\src\Boo.Lang.Compiler\Typ
eSystem\TypeSystemServices.cs:line 1358
at Boo.Lang.Compiler.TypeSystem.TypeSystemServices.GetEntity(Node node) in c:\code\svnboo\src\Boo.Lang.Compiler\TypeS
ystem\TypeSystemServices.cs:line 922
at Boo.Lang.Compiler.TypeSystem.InternalClass.GetConstructors() in c:\code\svnboo\src\Boo.Lang.Compiler\TypeSystem\In
ternalClass.cs:line 113
at Boo.Lang.Compiler.TypeSystem.GenericConstructionChecker.HasDefaultConstructor(IType argument) in c:\code\svnboo\sr
c\Boo.Lang.Compiler\TypeSystem\GenericsServices.cs:line 469
at Boo.Lang.Compiler.TypeSystem.GenericConstructionChecker.ViolatesParameterConstraints(IGenericParameter parameter,
IType argument) in c:\code\svnboo\src\Boo.Lang.Compiler\TypeSystem\GenericsServices.cs:line 431
at Boo.Lang.Compiler.TypeSystem.GenericConstructionChecker.ViolatesParameterConstraints(IEntity definition) in c:\cod
e\svnboo\src\Boo.Lang.Compiler\TypeSystem\GenericsServices.cs:line 395
at Boo.Lang.Compiler.TypeSystem.GenericsServices.CheckGenericConstruction(Node node, IEntity definition, IType[] argu
mentTypes, CompilerErrorCollection errors) in c:\code\svnboo\src\Boo.Lang.Compiler\TypeSystem\GenericsServices.cs:line 1
40
at Boo.Lang.Compiler.TypeSystem.GenericsServices.ConstructEntity(Node constructionNode, IEntity definition, IType[] t
ypeArguments) in c:\code\svnboo\src\Boo.Lang.Compiler\TypeSystem\GenericsServices.cs:line 64
at Boo.Lang.Compiler.TypeSystem.NameResolutionService.ResolveGenericTypeReference(GenericTypeReference gtr, IEntity d
efinition) in c:\code\svnboo\src\Boo.Lang.Compiler\TypeSystem\NameResolutionService.cs:line 344
at Boo.Lang.Compiler.TypeSystem.NameResolutionService.ResolveSimpleTypeReference(SimpleTypeReference node) in c:\code
\svnboo\src\Boo.Lang.Compiler\TypeSystem\NameResolutionService.cs:line 302
at Boo.Lang.Compiler.Steps.ResolveTypeReferences.OnGenericTypeReference(GenericTypeReference node) in c:\code\svnboo\
src\Boo.Lang.Compiler\Steps\ResolveTypeReferences.cs:line 72
at Boo.Lang.Compiler.Ast.GenericTypeReference.Accept(IAstVisitor visitor) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast
\Impl\GenericTypeReferenceImpl.cs:line 63
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\DepthFirstVis
itor.cs:line 47
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.OnDeclaration(Declaration node) in c:\code\svnboo\src\Boo.Lang.Compiler\As
t\Impl\DepthFirstVisitor.cs:line 591
at Boo.Lang.Compiler.Ast.Declaration.Accept(IAstVisitor visitor) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\Impl\Dec
larationImpl.cs:line 65
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\DepthFirstVis
itor.cs:line 47
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.OnDeclarationStatement(DeclarationStatement node) in c:\code\svnboo\src\Bo
o.Lang.Compiler\Ast\Impl\DepthFirstVisitor.cs:line 721
at Boo.Lang.Compiler.Ast.DeclarationStatement.Accept(IAstVisitor visitor) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast
\Impl\DeclarationStatementImpl.cs:line 65
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\DepthFirstVis
itor.cs:line 47
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node[] array) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\DepthFirst
Visitor.cs:line 95
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit[T](NodeCollection`1 collection) in c:\code\svnboo\src\Boo.Lang.Compi
ler\Ast\DepthFirstVisitor.cs:line 103
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.OnBlock(Block node) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\Impl\Depth
FirstVisitor.cs:line 699
at Boo.Lang.Compiler.Ast.Block.Accept(IAstVisitor visitor) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\Impl\BlockImpl
.cs:line 63
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\DepthFirstVis
itor.cs:line 47
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.OnMethod(Method node) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\Impl\Dep
thFirstVisitor.cs:line 469
at Boo.Lang.Compiler.Steps.ResolveTypeReferences.OnMethod(Method node) in c:\code\svnboo\src\Boo.Lang.Compiler\Steps\
ResolveTypeReferences.cs:line 56
at Boo.Lang.Compiler.Ast.Method.Accept(IAstVisitor visitor) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\Impl\MethodIm
pl.cs:line 69
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\DepthFirstVis
itor.cs:line 47
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node[] array) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\DepthFirst
Visitor.cs:line 95
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit[T](NodeCollection`1 collection) in c:\code\svnboo\src\Boo.Lang.Compi
ler\Ast\DepthFirstVisitor.cs:line 103
at Boo.Lang.Compiler.Steps.AbstractNamespaceSensitiveVisitorCompilerStep.VisitTypeDefinitionBody(TypeDefinition node)
in c:\code\svnboo\src\Boo.Lang.Compiler\Steps\AbstractNamespaceSensitiveVisitorCompilerStep.cs:line 94
at Boo.Lang.Compiler.Steps.AbstractNamespaceSensitiveVisitorCompilerStep.OnClassDefinition(ClassDefinition node) in c
:\code\svnboo\src\Boo.Lang.Compiler\Steps\AbstractNamespaceSensitiveVisitorCompilerStep.cs:line 72
at Boo.Lang.Compiler.Ast.ClassDefinition.Accept(IAstVisitor visitor) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\Impl
\ClassDefinitionImpl.cs:line 61
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\DepthFirstVis
itor.cs:line 47
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node[] array) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\DepthFirst
Visitor.cs:line 95
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit[T](NodeCollection`1 collection) in c:\code\svnboo\src\Boo.Lang.Compi
ler\Ast\DepthFirstVisitor.cs:line 103
at Boo.Lang.Compiler.Steps.AbstractNamespaceSensitiveVisitorCompilerStep.VisitTypeDefinitionBody(TypeDefinition node)
in c:\code\svnboo\src\Boo.Lang.Compiler\Steps\AbstractNamespaceSensitiveVisitorCompilerStep.cs:line 94
at Boo.Lang.Compiler.Steps.AbstractNamespaceSensitiveVisitorCompilerStep.OnModule(Module module) in c:\code\svnboo\sr
c\Boo.Lang.Compiler\Steps\AbstractNamespaceSensitiveVisitorCompilerStep.cs:line 64
at Boo.Lang.Compiler.Ast.Module.Accept(IAstVisitor visitor) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\Impl\ModuleIm
pl.cs:line 69
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node node) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\DepthFirstVis
itor.cs:line 47
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit(Node[] array) in c:\code\svnboo\src\Boo.Lang.Compiler\Ast\DepthFirst
Visitor.cs:line 95
at Boo.Lang.Compiler.Ast.DepthFirstVisitor.Visit[T](NodeCollection`1 collection) in c:\code\svnboo\src\Boo.Lang.Compi
ler\Ast\DepthFirstVisitor.cs:line 103
at Boo.Lang.Compiler.Steps.ResolveTypeReferences.Run() in c:\code\svnboo\src\Boo.Lang.Compiler\Steps\ResolveTypeRefer
ences.cs:line 42
at Boo.Lang.Compiler.CompilerPipeline.RunStep(CompilerContext context, ICompilerStep step) in c:\code\svnboo\src\Boo.
Lang.Compiler\CompilerPipeline.cs:line 311


Avishay Lavie - 15/Jun/08 01:54 PM
Thanks, I'll certainly look into these.
As mentioned, constraints aren't quite done yet, and these make for very good testcases as to the parts that still don't work. Please keep them coming!