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: 13/Oct/08 07:52 AM
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.



Avishay Lavie added a comment - 06/Jun/08 04:26 PM

Partially implemented as of revision 2996.


Greg Nagel added a comment - 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 added a comment - 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 added a comment - 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!


Avishay Lavie added a comment - 13/Oct/08 06:52 AM

The first issue, in both forms, is resolved in r3047.


Avishay Lavie added a comment - 13/Oct/08 07:52 AM

The second issue is resolved in r3048.

Thanks for reporting these!