mirror of
https://github.com/twiglet/cs2j.git
synced 2025-01-18 13:15:17 +01:00
Change to create instantiated generic types. For the moment we probably just have arrays working(ish)
This commit is contained in:
parent
0b380e063d
commit
adb34dffbe
@ -21,6 +21,11 @@ scope NSContext {
|
|||||||
List<string> namespaces;
|
List<string> namespaces;
|
||||||
// all namespaces in all scopes
|
// all namespaces in all scopes
|
||||||
List<string> globalNamespaces;
|
List<string> globalNamespaces;
|
||||||
|
|
||||||
|
// all typevariables in scope
|
||||||
|
List<string> typeVariables;
|
||||||
|
// all typevariables in all scopes
|
||||||
|
List<string> globalTypeVariables;
|
||||||
}
|
}
|
||||||
|
|
||||||
// A scope to keep track of the mapping from variables to types
|
// A scope to keep track of the mapping from variables to types
|
||||||
@ -70,7 +75,7 @@ scope SymTab {
|
|||||||
public void AddToImports(string imp) {
|
public void AddToImports(string imp) {
|
||||||
// Don't add import if its namespace is within our type
|
// Don't add import if its namespace is within our type
|
||||||
// if (!imp.StartsWith($NSContext::currentNS+".")) {
|
// if (!imp.StartsWith($NSContext::currentNS+".")) {
|
||||||
if (imp != null && !imp.StartsWith(NSPrefix(CompUnitName))) {
|
if (imp != null && (CompUnitName == null || CompUnitName.Length == 0 || !imp.StartsWith(NSPrefix(CompUnitName)))) {
|
||||||
Imports.Add(imp);
|
Imports.Add(imp);
|
||||||
}
|
}
|
||||||
// }
|
// }
|
||||||
@ -94,22 +99,23 @@ scope SymTab {
|
|||||||
return AppEnv.Search($NSContext::globalNamespaces, name, new UnknownRepTemplate(name));
|
return AppEnv.Search($NSContext::globalNamespaces, name, new UnknownRepTemplate(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected TypeRepTemplate findType(string name, TypeRepTemplate[] args) {
|
protected TypeRepTemplate findType(string name, ICollection<TypeRepTemplate> args) {
|
||||||
StringBuilder argNames = new StringBuilder();
|
StringBuilder argNames = new StringBuilder();
|
||||||
bool first = true;
|
bool first = true;
|
||||||
if (args != null && args.Length > 0) {
|
if (args != null && args.Count > 0) {
|
||||||
argNames.Append("[");
|
argNames.Append("[");
|
||||||
foreach (TypeRepTemplate ty in args) {
|
foreach (TypeRepTemplate sub in args) {
|
||||||
if (!first) {
|
if (!first) {
|
||||||
argNames.Append(", ");
|
argNames.Append(", ");
|
||||||
first = false;
|
first = false;
|
||||||
}
|
}
|
||||||
argNames.Append(ty.TypeName);
|
argNames.Append(sub.TypeName);
|
||||||
}
|
}
|
||||||
argNames.Append("]");
|
argNames.Append("]");
|
||||||
}
|
}
|
||||||
TypeRepTemplate tyRep = AppEnv.Search($NSContext::globalNamespaces, name, new UnknownRepTemplate(name + argNames.ToString()));
|
|
||||||
return tyRep.Instantiate(args);
|
TypeRepTemplate tyRep = AppEnv.Search($NSContext::globalNamespaces, mkGenericTypeAlias(name, args != null ? args.Count : 0), new UnknownRepTemplate(name + argNames.ToString()));
|
||||||
|
return (args != null && args.Count > 0 ? tyRep.Instantiate(args) : tyRep);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ClassRepTemplate objectType = null;
|
private ClassRepTemplate objectType = null;
|
||||||
@ -428,6 +434,9 @@ scope NSContext;
|
|||||||
// TODO: Do we need to ensure we have access to System? If so, can add it here.
|
// TODO: Do we need to ensure we have access to System? If so, can add it here.
|
||||||
$NSContext::namespaces = SearchPath ?? new List<string>();
|
$NSContext::namespaces = SearchPath ?? new List<string>();
|
||||||
$NSContext::globalNamespaces = SearchPath ?? new List<string>();
|
$NSContext::globalNamespaces = SearchPath ?? new List<string>();
|
||||||
|
|
||||||
|
$NSContext::typeVariables = new List<string>();
|
||||||
|
$NSContext::globalTypeVariables = new List<string>();
|
||||||
}:
|
}:
|
||||||
^(pkg=PACKAGE ns=PAYLOAD { $NSContext::currentNS = $ns.text; } dec=type_declaration )
|
^(pkg=PACKAGE ns=PAYLOAD { $NSContext::currentNS = $ns.text; } dec=type_declaration )
|
||||||
-> ^($pkg $ns { mkImports() } $dec);
|
-> ^($pkg $ns { mkImports() } $dec);
|
||||||
@ -839,21 +848,21 @@ commas:
|
|||||||
///////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////
|
||||||
|
|
||||||
type_name returns [string name, TypeRepTemplate dotNetType]:
|
type_name returns [string name, TypeRepTemplate dotNetType]:
|
||||||
namespace_or_type_name { $name = $namespace_or_type_name.name; $dotNetType = findType($namespace_or_type_name.name); } ;
|
namespace_or_type_name { $name = $namespace_or_type_name.name; $dotNetType = findType($namespace_or_type_name.name, $namespace_or_type_name.tyargs); } ;
|
||||||
namespace_or_type_name returns [string name, List<string> tyargs]
|
namespace_or_type_name returns [string name, List<TypeRepTemplate> tyargs]
|
||||||
@init {
|
@init {
|
||||||
TypeRepTemplate tyRep = null;
|
TypeRepTemplate tyRep = null;
|
||||||
}:
|
}:
|
||||||
type_or_generic { $name = $type_or_generic.name; $tyargs = $type_or_generic.tyargs; }
|
type_or_generic { $name = $type_or_generic.name; $tyargs = $type_or_generic.tyargs; }
|
||||||
| ^('::' namespace_or_type_name type_or_generic) { $name = "System.Object"; } // give up, we don't support these
|
| ^('::' namespace_or_type_name type_or_generic) { $name = "System.Object"; } // give up, we don't support these
|
||||||
| ^(d='.' n1=namespace_or_type_name tg1=type_or_generic) { WarningAssert($n1.tyargs == null, $d.token.Line, "Didn't expect type arguments in prefix of type name"); $name = $n1.name + "." + $type_or_generic.name; $tyargs = $type_or_generic.tyargs; tyRep = findType($name); if (tyRep != null) AddToImports(tyRep.Imports); }
|
| ^(d='.' n1=namespace_or_type_name tg1=type_or_generic) { WarningAssert($n1.tyargs == null, $d.token.Line, "Didn't expect type arguments in prefix of type name"); $name = $n1.name + "." + $type_or_generic.name; $tyargs = $type_or_generic.tyargs; tyRep = findType($name, $tyargs); if (tyRep != null) AddToImports(tyRep.Imports); }
|
||||||
-> { tyRep != null }? IDENTIFIER[$d.token, tyRep.Java]
|
-> { tyRep != null }? IDENTIFIER[$d.token, tyRep.Java]
|
||||||
-> ^($d $n1 $tg1)
|
-> ^($d $n1 $tg1)
|
||||||
;
|
;
|
||||||
|
|
||||||
type_or_generic returns [string name, List<string> tyargs]
|
type_or_generic returns [string name, List<TypeRepTemplate> tyargs]
|
||||||
:
|
:
|
||||||
(identifier_type generic_argument_list) => t=identifier_type { $name = $identifier_type.thetext; } generic_argument_list { $tyargs = $generic_argument_list.argTexts; }
|
(identifier_type generic_argument_list) => t=identifier_type { $name = $identifier_type.thetext; } generic_argument_list { $tyargs = $generic_argument_list.argTypes; }
|
||||||
| t=identifier_type { $name = $identifier_type.thetext; } ;
|
| t=identifier_type { $name = $identifier_type.thetext; } ;
|
||||||
|
|
||||||
identifier_type returns [string thetext]
|
identifier_type returns [string thetext]
|
||||||
@ -884,14 +893,15 @@ qid_start:
|
|||||||
qid_part:
|
qid_part:
|
||||||
access_identifier;
|
access_identifier;
|
||||||
|
|
||||||
generic_argument_list returns [List<string> argTexts]:
|
generic_argument_list returns [List<TypeRepTemplate> argTypes]:
|
||||||
'<' type_arguments '>' { $argTexts = $type_arguments.tyTexts; };
|
'<' type_arguments '>' { $argTypes = $type_arguments.tyTypes; };
|
||||||
type_arguments returns [List<string> tyTexts]
|
type_arguments returns [List<TypeRepTemplate> tyTypes]
|
||||||
@init {
|
@init {
|
||||||
$tyTexts = new List<string>();
|
$tyTypes = new List<TypeRepTemplate>();
|
||||||
}:
|
}:
|
||||||
t1=type { $tyTexts.Add($t1.dotNetType.TypeName); } (',' tn=type { $tyTexts.Add($tn.dotNetType.TypeName); })* ;
|
t1=type { $tyTypes.Add($t1.dotNetType); } (',' tn=type { $tyTypes.Add($tn.dotNetType); })* ;
|
||||||
|
|
||||||
|
// keving: TODO: Look for type vars
|
||||||
type returns [TypeRepTemplate dotNetType]
|
type returns [TypeRepTemplate dotNetType]
|
||||||
:
|
:
|
||||||
^(TYPE (predefined_type { $dotNetType = $predefined_type.dotNetType; }
|
^(TYPE (predefined_type { $dotNetType = $predefined_type.dotNetType; }
|
||||||
@ -1397,14 +1407,22 @@ scope NSContext,SymTab;
|
|||||||
@init {
|
@init {
|
||||||
$NSContext::namespaces = new List<string>();
|
$NSContext::namespaces = new List<string>();
|
||||||
$NSContext::globalNamespaces = new List<string>(((NSContext_scope)$NSContext.ToArray()[1]).globalNamespaces);
|
$NSContext::globalNamespaces = new List<string>(((NSContext_scope)$NSContext.ToArray()[1]).globalNamespaces);
|
||||||
|
$NSContext::typeVariables = new List<string>();
|
||||||
|
$NSContext::globalTypeVariables = new List<string>(((NSContext_scope)$NSContext.ToArray()[1]).globalTypeVariables);
|
||||||
$SymTab::symtab = new Dictionary<string, TypeRepTemplate>();
|
$SymTab::symtab = new Dictionary<string, TypeRepTemplate>();
|
||||||
}
|
}
|
||||||
:
|
:
|
||||||
^(c=CLASS attributes? modifiers? identifier { $NSContext::currentNS = ParentNameSpace + "." + $identifier.thetext; if (CompUnitName == null) CompUnitName = $NSContext::currentNS; } type_parameter_constraints_clauses? type_parameter_list?
|
^(c=CLASS attributes? modifiers? identifier type_parameter_constraints_clauses?
|
||||||
|
type_parameter_list?
|
||||||
|
{ $NSContext::currentNS = NSPrefix(ParentNameSpace) + mkGenericTypeAlias($identifier.thetext, $type_parameter_list.tyParams); if (CompUnitName == null) CompUnitName = $NSContext::currentNS; }
|
||||||
class_implements?
|
class_implements?
|
||||||
{
|
{
|
||||||
$NSContext::namespaces.Add($NSContext::currentNS);
|
$NSContext::namespaces.Add($NSContext::currentNS);
|
||||||
$NSContext::globalNamespaces.Add($NSContext::currentNS);
|
$NSContext::globalNamespaces.Add($NSContext::currentNS);
|
||||||
|
if ($type_parameter_list.tyParams != null) {
|
||||||
|
$NSContext::typeVariables.AddRange($type_parameter_list.tyParams);
|
||||||
|
$NSContext::globalTypeVariables.AddRange($type_parameter_list.tyParams);
|
||||||
|
}
|
||||||
ClassRepTemplate classTypeRep = (ClassRepTemplate)AppEnv.Search($NSContext::currentNS);
|
ClassRepTemplate classTypeRep = (ClassRepTemplate)AppEnv.Search($NSContext::currentNS);
|
||||||
if (classTypeRep == null) {
|
if (classTypeRep == null) {
|
||||||
Error($c.line, "Could not find class " + $NSContext::currentNS + " in the type environment");
|
Error($c.line, "Could not find class " + $NSContext::currentNS + " in the type environment");
|
||||||
@ -1425,11 +1443,14 @@ scope NSContext,SymTab;
|
|||||||
-> {$class_implements.hasExtends && $class_implements.extendDotNetType.IsA(AppEnv.Search("System.Attribute", new UnknownRepTemplate("System.Attribute")), AppEnv)}? magicAnnotation
|
-> {$class_implements.hasExtends && $class_implements.extendDotNetType.IsA(AppEnv.Search("System.Attribute", new UnknownRepTemplate("System.Attribute")), AppEnv)}? magicAnnotation
|
||||||
-> ^($c attributes? modifiers? identifier type_parameter_constraints_clauses? type_parameter_list? class_implements? class_body);
|
-> ^($c attributes? modifiers? identifier type_parameter_constraints_clauses? type_parameter_list? class_implements? class_body);
|
||||||
|
|
||||||
type_parameter_list:
|
type_parameter_list returns [List<string> tyParams]
|
||||||
(attributes? type_parameter)+ ;
|
@init {
|
||||||
|
$tyParams = new List<string>();
|
||||||
|
}:
|
||||||
|
(attributes? type_parameter { $tyParams.Add($type_parameter.thetext); })+ ;
|
||||||
|
|
||||||
type_parameter:
|
type_parameter returns [string thetext]:
|
||||||
identifier ;
|
identifier { $thetext = $identifier.thetext; };
|
||||||
|
|
||||||
class_extends:
|
class_extends:
|
||||||
class_extend+ ;
|
class_extend+ ;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user