浏览代码

Initial generics implementation. Very basic support.

woollybah 8 年之前
父节点
当前提交
b3aab8f474
共有 6 个文件被更改,包括 85 次插入28 次删除
  1. 13 1
      ctranslator.bmx
  2. 39 15
      decl.bmx
  3. 6 1
      expr.bmx
  4. 13 4
      parser.bmx
  5. 13 6
      stmt.bmx
  6. 1 1
      type.bmx

+ 13 - 1
ctranslator.bmx

@@ -3224,6 +3224,10 @@ End Rem
 	End Method
 
 	Method EmitClassProto( classDecl:TClassDecl )
+	
+		If classDecl.args Then
+			Return
+		End If
 
 		Local classid$=classDecl.munged
 		Local superid$
@@ -3798,6 +3802,10 @@ End Rem
 	End Method
 
 	Method EmitClassDecl( classDecl:TClassDecl )
+	
+		If classDecl.args Then
+			Return
+		End If
 
 		PushEnv classDecl
 		'If classDecl.IsTemplateInst()
@@ -4854,6 +4862,10 @@ End Rem
 	End Method
 
 	Method EmitIfcClassDecl(classDecl:TClassDecl)
+	
+		If classDecl.args Then
+			Return
+		End If
 
 		Local head:String = classDecl.ident + "^"
 		If classDecl.superClass Then
@@ -5476,7 +5488,7 @@ End If
 			If decl.declImported Continue
 
 			Local cdecl:TClassDecl=TClassDecl( decl )
-			If cdecl And Not cdecl.IsExtern()
+			If cdecl And Not cdecl.IsExtern() And Not cdecl.args
 				If Not cdecl.IsInterface() Then
 					If Not cdecl.IsStruct() Then
 						Emit "bbObjectRegisterType(&" + cdecl.munged + ");"

+ 39 - 15
decl.bmx

@@ -336,7 +336,7 @@ Type TValDecl Extends TDecl
 	End Method
 	
 	Method OnSemant()
-	
+'DebugStop	
 		If declTy
 
 			Local at:TType = TArrayType(declTy)
@@ -562,8 +562,10 @@ Type TLocalDecl Extends TVarDecl
 	End Method
 	
 	Method OnCopy:TDecl(deep:Int = True)
-		Local decl:TLocalDecl = New TLocalDecl.Create( ident,ty,CopyInit(),attrs &~ DECL_SEMANTED, generated, volatile )
+		Local decl:TLocalDecl = New TLocalDecl.Create( ident,declTy,declInit,attrs &~ DECL_SEMANTED, generated, volatile )
 		decl.scope = scope
+		decl.ty = ty
+		decl.init = init
 		Return decl
 	End Method
 
@@ -604,9 +606,9 @@ Type TArgDecl Extends TLocalDecl
 	End Method
 	
 	Method OnCopy:TDecl(deep:Int = True)
-		Local d:TArgDecl = New TArgDecl.Create( ident,ty,CopyInit(),attrs,generated,volatile )
-		d.ty = d.declTy
-		d.init = d.declInit
+		Local d:TArgDecl = New TArgDecl.Create( ident,declTy,declInit,attrs,generated,volatile )
+		d.ty = ty
+		d.init = init
 		Return d
 	End Method
 
@@ -636,7 +638,10 @@ Type TGlobalDecl Extends TVarDecl
 	End Method
 
 	Method OnCopy:TDecl(deep:Int = True)
-		Return New TGlobalDecl.Create( ident,ty,CopyInit(),attrs,funcGlobal )
+		Local g:TGlobalDecl = New TGlobalDecl.Create( ident,declTy,declInit,attrs,funcGlobal )
+		g.ty = ty
+		g.init = init
+		Return g
 	End Method
 	
 	Method ToString$()
@@ -683,7 +688,9 @@ Type TFieldDecl Extends TVarDecl
 	End Method
 
 	Method OnCopy:TDecl(deep:Int = True)
-		Local f:TFieldDecl = New TFieldDecl.Create( ident,ty,CopyInit(),attrs )
+		Local f:TFieldDecl = New TFieldDecl.Create( ident,declTy,declInit,attrs )
+		f.ty = ty
+		f.init = init
 		f.metadata = metadata
 		Return f
 	End Method
@@ -803,14 +810,14 @@ Type TScopeDecl Extends TDecl
 		Return fdecls
 	End Method
 	
-	Method InsertDecl( decl:TDecl )
+	Method InsertDecl( decl:TDecl, isCopy:Int = False )
 
-		If decl.scope And Not (decl.attrs & DECL_INITONLY) InternalErr
+		If decl.scope And Not (decl.attrs & DECL_INITONLY) And Not isCopy InternalErr
 		
 		'Local ident$=decl.ident
 		If Not decl.ident Return
 		
-		If Not decl.scope Then
+		If Not decl.scope Or isCopy Then
 			decl.scope=Self
 		End If
 		_decls.AddLast decl
@@ -1630,6 +1637,7 @@ Type TFuncDecl Extends TBlockDecl
 			Next
 		End If
 		t.retType = retType
+		t.retTypeExpr = retTypeExpr
 		t.scope = scope
 		t.overrides = overrides
 		t.superCtor = superCtor
@@ -2081,7 +2089,7 @@ Type TClassDecl Extends TScopeDecl
 		Self.objectType=New TObjectType.Create( Self )
 		If args
 			instances=New TList
-			instances.AddLast Self
+			'instances.AddLast Self
 		EndIf
 		Return Self
 	End Method
@@ -2203,13 +2211,13 @@ End Rem
 		inst.instanceof=Self
 		inst.instArgs=instArgs
 		instances.AddLast inst
-		
+
 		For Local i:Int=0 Until args.Length
 			inst.InsertDecl New TAliasDecl.Create( args[i].ToString(),instArgs[i],0 )
 		Next
-		
+
 		For Local decl:TDecl=EachIn _decls
-			inst.InsertDecl decl.Copy()
+			inst.InsertDecl decl.Copy(), True
 		Next
 
 		Return inst
@@ -2461,6 +2469,10 @@ End Rem
 	End Method
 	
 	Method OnSemant()
+	
+		If args Then
+			Return
+		End If
 
 		PushEnv Self
 
@@ -2583,6 +2595,9 @@ End Rem
 '		If IsSemanted() Return
 		
 '		Super.Semant()
+		If args Then
+			Return
+		End If
 		
 		For Local decl:TConstDecl = EachIn Decls()
 			decl.Semant()
@@ -3216,7 +3231,16 @@ Type TModuleDecl Extends TScopeDecl
 		Next
 
 		For Local cdecl:TClassDecl=EachIn _decls
-			cdecl.Semant
+			If cdecl.args Then
+				For Local inst:TClassDecl = EachIn cdecl.instances
+					For Local idecl:TDecl = EachIn inst.Decls()
+						If TAliasDecl( idecl ) Continue
+						idecl.Semant()
+					Next
+				Next
+			Else
+				cdecl.Semant
+			End If
 		Next
 
 		For Local fdecl:TFuncDecl=EachIn _decls

+ 6 - 1
expr.bmx

@@ -2384,7 +2384,12 @@ Type TIdentExpr Extends TExpr
 	End Method
 
 	Method Copy:TExpr()
-		Return New TIdentExpr.Create( ident,CopyExpr(expr), _identLower )
+		Local i:TIdentExpr = New TIdentExpr.Create( ident,CopyExpr(expr), _identLower )
+		i.static = static
+		i.isArg = isArg
+		i.isRhs = isRhs
+		i.fixedScope = fixedScope
+		Return i
 	End Method
 
 	Method ToString$()

+ 13 - 4
parser.bmx

@@ -499,12 +499,13 @@ Type TParser
 		If CParse( "." ) id:+"."+ParseIdent()
 		If CParse( "." ) id:+"."+ParseIdent()
 
-		Local args:TIdentType[]
+		Local args:TType[]
 		If CParse( "<" )
 			Local nargs:Int
 			Repeat
-				Local arg:TIdentType=ParseIdentType()
-				If args.Length=nargs args=args+ New TIdentType[10]
+				'Local arg:TIdentType=ParseIdentType()
+				Local arg:TType = ParseType()
+				If args.Length=nargs args=args+ New TType[10]
 				args[nargs]=arg
 				nargs:+1
 			Until Not CParse(",")
@@ -3086,7 +3087,15 @@ End Rem
 		'check for metadata
 		meta = ParseMetaData()
 
-		Local classDecl:TClassDecl=New TClassDecl.Create( id,String[](args.ToArray()),superTy,imps,attrs )
+		
+		Local sargs:String[] = New String[args.Count()]
+		Local i:Int = 0
+		For Local arg:String = EachIn args
+			sargs[i] = arg
+			i :+ 1
+		Next
+
+		Local classDecl:TClassDecl=New TClassDecl.Create( id,sargs,superTy,imps,attrs )
 		
 		If meta Then
 			If attrs & CLASS_STRUCT

+ 13 - 6
stmt.bmx

@@ -69,10 +69,11 @@ Type TDeclStmt Extends TStmt
 	End Method
 
 	Method OnCopy:TStmt( scope:TScopeDecl )
-		If Not decl.scope Then
-			decl.scope = scope
-		End If
-		Return New TDeclStmt.Create( decl.Copy(), generated )
+		Local d:TDecl = decl.Copy()
+		'If Not d.scope Then
+		d.scope = Null
+		'End If
+		Return New TDeclStmt.Create( d, generated )
 	End Method
 	
 	Method OnSemant()
@@ -223,8 +224,14 @@ Type TReturnStmt Extends TStmt
 	End Method
 
 	Method OnCopy:TStmt( scope:TScopeDecl )
-		If expr Return New TReturnStmt.Create( expr.Copy() )
-		Return New TReturnStmt.Create( Null )
+		Local r:TReturnStmt
+		If expr Then
+			r = New TReturnStmt.Create( expr.Copy() )
+		Else
+			r = New TReturnStmt.Create( Null )
+		End If
+		r.fRetType = fRetType
+		Return r
 	End Method
 	
 	Method OnSemant()

+ 1 - 1
type.bmx

@@ -1539,7 +1539,7 @@ Type TIdentType Extends TType
 	
 	
 	Method Semant:TType(ignoreNotFoundError:Int = 0)
-'If ident="obj" DebugStop
+'If ident="TStack" DebugStop
 		If Not ident Return TType.nullObjectType
 
 		Local targs:TType[args.Length]