1
0
mirror of https://github.com/twiglet/cs2j.git synced 2025-01-18 13:15:17 +01:00

New option: warning-resolve-failures for when we can't find a translation. Off by default because it can be very noisy

This commit is contained in:
Kevin Glynn 2011-02-25 14:07:31 +01:00
parent f1db436236
commit 590efcda26
4 changed files with 50 additions and 17 deletions

View File

@ -61,6 +61,7 @@ namespace Twiglet.CS2J.Translator
Console.Out.WriteLine(" [-debug <level>] (set debug level, default 0)"); Console.Out.WriteLine(" [-debug <level>] (set debug level, default 0)");
Console.Out.WriteLine(" [-debug-template-extraction <true/false>] (show debug messages during template extraction, default true)"); Console.Out.WriteLine(" [-debug-template-extraction <true/false>] (show debug messages during template extraction, default true)");
Console.Out.WriteLine(" [-warnings <true/false>] (show warnings, default true)"); Console.Out.WriteLine(" [-warnings <true/false>] (show warnings, default true)");
Console.Out.WriteLine(" [-warning-resolve-failures <true/false>] (show warnings for resolve failures, default true)");
Console.Out.WriteLine(" <directory or file name to be translated>"); Console.Out.WriteLine(" <directory or file name to be translated>");
Environment.Exit(0); Environment.Exit(0);
} }
@ -92,6 +93,7 @@ namespace Twiglet.CS2J.Translator
.Add ("debug=", v => cfg.DebugLevel = Int32.Parse(v)) .Add ("debug=", v => cfg.DebugLevel = Int32.Parse(v))
.Add ("debug-template-extraction=", v => cfg.DebugTemplateExtraction = Boolean.Parse(v)) .Add ("debug-template-extraction=", v => cfg.DebugTemplateExtraction = Boolean.Parse(v))
.Add ("warnings=", v => cfg.Warnings = Boolean.Parse(v)) .Add ("warnings=", v => cfg.Warnings = Boolean.Parse(v))
.Add ("warnings-resolve-failures=", v => cfg.WarningsFailedResolves = Boolean.Parse(v))
.Add ("version", v => showVersion()) .Add ("version", v => showVersion())
.Add ("help|h|?", v => showUsage()) .Add ("help|h|?", v => showUsage())
.Add ("dumpcsharp", v => cfg.DumpCSharp = true) .Add ("dumpcsharp", v => cfg.DumpCSharp = true)

View File

@ -37,6 +37,7 @@ namespace Twiglet.CS2J.Translator
public int DebugLevel { get; set; } public int DebugLevel { get; set; }
public bool Warnings { get; set; } public bool Warnings { get; set; }
public bool WarningsFailedResolves { get; set; }
public bool TranslatorKeepParens public bool TranslatorKeepParens
{ {
@ -79,6 +80,7 @@ namespace Twiglet.CS2J.Translator
DebugTemplateExtraction = true; DebugTemplateExtraction = true;
DebugLevel = 0; DebugLevel = 0;
Warnings = true; Warnings = true;
WarningsFailedResolves = false;
TranslatorKeepParens = true; TranslatorKeepParens = true;
TranslatorAddTimeStamp = true; TranslatorAddTimeStamp = true;

View File

@ -59,6 +59,12 @@ namespace Twiglet.CS2J.Translator.Transform
Console.Out.WriteLine("{0} failed assertion: {1}", Filename, s); Console.Out.WriteLine("{0} failed assertion: {1}", Filename, s);
} }
protected void WarningFailedResolve(int line, String s)
{
if (Cfg.WarningsFailedResolves)
Console.Out.WriteLine("{0}({1}) warning: {2}", Filename, line, s);
}
protected void Debug(String s) protected void Debug(String s)
{ {
Debug(1, s); Debug(1, s);

View File

@ -180,7 +180,7 @@ scope SymTab {
} }
protected TypeRepTemplate SymTabLookup(string name) { protected TypeRepTemplate SymTabLookup(string name) {
return SymTabLookup(name, null); return SymTabLookup(name, new UnknownRepTemplate("TYPE OF " + name));
} }
protected TypeRepTemplate SymTabLookup(string name, TypeRepTemplate def) { protected TypeRepTemplate SymTabLookup(string name, TypeRepTemplate def) {
@ -498,9 +498,9 @@ scope {
if (ret != null) if (ret != null)
$primary_expression.tree = ret; $primary_expression.tree = ret;
}: }:
^(INDEX ie=expression expression_list?) ^(index=INDEX ie=expression expression_list?)
{ {
if ($ie.dotNetType != null) { if ($ie.dotNetType != null && !$ie.dotNetType.IsUnknownType) {
$dotNetType = new UnknownRepTemplate($ie.dotNetType.TypeName+".INDEXER"); $dotNetType = new UnknownRepTemplate($ie.dotNetType.TypeName+".INDEXER");
ResolveResult indexerResult = $ie.dotNetType.ResolveIndexer($expression_list.expTypes ?? new List<TypeRepTemplate>(), AppEnv); ResolveResult indexerResult = $ie.dotNetType.ResolveIndexer($expression_list.expTypes ?? new List<TypeRepTemplate>(), AppEnv);
if (indexerResult != null) { if (indexerResult != null) {
@ -520,12 +520,18 @@ scope {
$dotNetType = indexerResult.ResultType; $dotNetType = indexerResult.ResultType;
} }
} }
else {
WarningFailedResolve($index.token.Line, "Could not resolve index expression");
}
}
else {
WarningFailedResolve($index.token.Line, "Could not find type of indexed expression");
} }
} }
| (^(APPLY (^('.' expression identifier)|identifier) argument_list?)) => | (^(APPLY (^('.' expression identifier)|identifier) argument_list?)) =>
^(APPLY (^('.' e2=expression {expType = $e2.dotNetType; implicitThis = false;} i2=identifier)|i2=identifier) argument_list?) ^(APPLY (^('.' e2=expression {expType = $e2.dotNetType; implicitThis = false;} i2=identifier)|i2=identifier) argument_list?)
{ {
if (expType != null) { if (expType != null && !expType.IsUnknownType) {
$dotNetType = new UnknownRepTemplate(expType.TypeName+".APPLY"); $dotNetType = new UnknownRepTemplate(expType.TypeName+".APPLY");
ResolveResult methodResult = expType.Resolve($i2.thetext, $argument_list.argTypes ?? new List<TypeRepTemplate>(), AppEnv); ResolveResult methodResult = expType.Resolve($i2.thetext, $argument_list.argTypes ?? new List<TypeRepTemplate>(), AppEnv);
if (methodResult != null) { if (methodResult != null) {
@ -546,6 +552,12 @@ scope {
AddToImports(methodResult.Result.Imports); AddToImports(methodResult.Result.Imports);
$dotNetType = methodResult.ResultType; $dotNetType = methodResult.ResultType;
} }
else {
WarningFailedResolve($i2.tree.Token.Line, "Could not resolve method application");
}
}
else {
WarningFailedResolve($i2.tree.Token.Line, "Could not find type needed to resolve method application");
} }
} }
| ^(APPLY {$primary_expression::parentIsApply = true; } expression {$primary_expression::parentIsApply = false; } argument_list?) | ^(APPLY {$primary_expression::parentIsApply = true; } expression {$primary_expression::parentIsApply = false; } argument_list?)
@ -576,15 +588,11 @@ scope {
AddToImports(fieldResult.Result.Imports); AddToImports(fieldResult.Result.Imports);
$dotNetType = fieldResult.ResultType; $dotNetType = fieldResult.ResultType;
} }
else if ($e1.dotNetType is UnknownRepTemplate) { else if ($e1.dotNetType.IsUnknownType) {
string staticType = $e1.dotNetType + "." + $i1.thetext; string staticType = $e1.dotNetType + "." + $i1.thetext;
TypeRepTemplate type = findType(staticType); $dotNetType = findType(staticType);
if (type != null) { if (!$dotNetType.IsUnknownType) {
AddToImports(type.Imports); AddToImports($dotNetType.Imports);
$dotNetType = type;
}
else {
$dotNetType = new UnknownRepTemplate(staticType);
} }
} }
} }
@ -604,7 +612,7 @@ scope {
// - part of a type name // - part of a type name
bool found = false; bool found = false;
TypeRepTemplate idType = SymTabLookup($identifier.thetext); TypeRepTemplate idType = SymTabLookup($identifier.thetext);
if (idType != null) { if (idType != null && !idType.IsUnknownType) {
$dotNetType = idType; $dotNetType = idType;
found = true; found = true;
} }
@ -613,7 +621,7 @@ scope {
TypeRepTemplate thisType = SymTabLookup("this"); TypeRepTemplate thisType = SymTabLookup("this");
// Is it a property read? Ensure we are not being applied to arguments or about to be assigned // Is it a property read? Ensure we are not being applied to arguments or about to be assigned
if (thisType != null && if (thisType != null && !thisType.IsUnknownType &&
($primary_expression.Count == 1 || !((primary_expression_scope)($primary_expression.ToArray()[1])).parentIsApply)) { ($primary_expression.Count == 1 || !((primary_expression_scope)($primary_expression.ToArray()[1])).parentIsApply)) {
Debug($identifier.tree.Token.Line + ": '" + $identifier.thetext + "' might be a property"); Debug($identifier.tree.Token.Line + ": '" + $identifier.thetext + "' might be a property");
@ -630,7 +638,7 @@ scope {
if (!found) { if (!found) {
// Not a variable, not a property read, is it a type name? // Not a variable, not a property read, is it a type name?
TypeRepTemplate staticType = findType($i.thetext); TypeRepTemplate staticType = findType($i.thetext);
if (staticType != null) { if (!staticType.IsUnknownType) {
AddToImports(staticType.Imports); AddToImports(staticType.Imports);
$dotNetType = staticType; $dotNetType = staticType;
found = true; found = true;
@ -661,6 +669,9 @@ scope {
AddToImports(conResult.Result.Imports); AddToImports(conResult.Result.Imports);
$dotNetType = conResult.ResultType; $dotNetType = conResult.ResultType;
} }
else {
WarningFailedResolve($n.token.Line, "Could not resolve constructor");
}
} }
| 'new' ( | 'new' (
// try the simple one first, this has no argS and no expressions // try the simple one first, this has no argS and no expressions
@ -971,7 +982,7 @@ assignment
(^('.' se=expression i=identifier generic_argument_list?) | i=identifier { isThis = true;}) a=assignment_operator rhs=expression (^('.' se=expression i=identifier generic_argument_list?) | i=identifier { isThis = true;}) a=assignment_operator rhs=expression
{ {
TypeRepTemplate seType = (isThis ? SymTabLookup("this") : $se.dotNetType); TypeRepTemplate seType = (isThis ? SymTabLookup("this") : $se.dotNetType);
if (seType != null) { if (seType != null && !seType.IsUnknownType) {
ResolveResult fieldResult = seType.Resolve($i.thetext, AppEnv); ResolveResult fieldResult = seType.Resolve($i.thetext, AppEnv);
if (fieldResult != null && fieldResult.Result is PropRepTemplate) { if (fieldResult != null && fieldResult.Result is PropRepTemplate) {
PropRepTemplate propRep = fieldResult.Result as PropRepTemplate; PropRepTemplate propRep = fieldResult.Result as PropRepTemplate;
@ -1003,12 +1014,18 @@ assignment
} }
} }
} }
else {
WarningFailedResolve($i.tree.Token.Line, "Could not resolve field or property expression");
}
}
else {
WarningFailedResolve($i.tree.Token.Line, "Could not find type of expression for field /property access");
} }
} }
| (^(INDEX expression expression_list?) assignment_operator) => | (^(INDEX expression expression_list?) assignment_operator) =>
^(INDEX ie=expression expression_list?) ia=assignment_operator irhs=expression ^(INDEX ie=expression expression_list?) ia=assignment_operator irhs=expression
{ {
if ($ie.dotNetType != null) { if ($ie.dotNetType != null && !$ie.dotNetType.IsUnknownType) {
ResolveResult indexerResult = $ie.dotNetType.ResolveIndexer($expression_list.expTypes ?? new List<TypeRepTemplate>(), AppEnv); ResolveResult indexerResult = $ie.dotNetType.ResolveIndexer($expression_list.expTypes ?? new List<TypeRepTemplate>(), AppEnv);
if (indexerResult != null) { if (indexerResult != null) {
IndexerRepTemplate indexerRep = indexerResult.Result as IndexerRepTemplate; IndexerRepTemplate indexerRep = indexerResult.Result as IndexerRepTemplate;
@ -1054,6 +1071,12 @@ assignment
} }
} }
} }
else {
WarningFailedResolve($ie.tree.Token.Line, "Could not resolve index expression");
}
}
else {
WarningFailedResolve($ie.tree.Token.Line, "Could not find type of expression for index access");
} }
} }
| unary_expression assignment_operator expression ; | unary_expression assignment_operator expression ;