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

View File

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

View File

@ -59,6 +59,12 @@ namespace Twiglet.CS2J.Translator.Transform
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)
{
Debug(1, s);

View File

@ -180,7 +180,7 @@ scope SymTab {
}
protected TypeRepTemplate SymTabLookup(string name) {
return SymTabLookup(name, null);
return SymTabLookup(name, new UnknownRepTemplate("TYPE OF " + name));
}
protected TypeRepTemplate SymTabLookup(string name, TypeRepTemplate def) {
@ -498,9 +498,9 @@ scope {
if (ret != null)
$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");
ResolveResult indexerResult = $ie.dotNetType.ResolveIndexer($expression_list.expTypes ?? new List<TypeRepTemplate>(), AppEnv);
if (indexerResult != null) {
@ -520,12 +520,18 @@ scope {
$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 (^('.' 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");
ResolveResult methodResult = expType.Resolve($i2.thetext, $argument_list.argTypes ?? new List<TypeRepTemplate>(), AppEnv);
if (methodResult != null) {
@ -546,6 +552,12 @@ scope {
AddToImports(methodResult.Result.Imports);
$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?)
@ -576,15 +588,11 @@ scope {
AddToImports(fieldResult.Result.Imports);
$dotNetType = fieldResult.ResultType;
}
else if ($e1.dotNetType is UnknownRepTemplate) {
else if ($e1.dotNetType.IsUnknownType) {
string staticType = $e1.dotNetType + "." + $i1.thetext;
TypeRepTemplate type = findType(staticType);
if (type != null) {
AddToImports(type.Imports);
$dotNetType = type;
}
else {
$dotNetType = new UnknownRepTemplate(staticType);
$dotNetType = findType(staticType);
if (!$dotNetType.IsUnknownType) {
AddToImports($dotNetType.Imports);
}
}
}
@ -604,7 +612,7 @@ scope {
// - part of a type name
bool found = false;
TypeRepTemplate idType = SymTabLookup($identifier.thetext);
if (idType != null) {
if (idType != null && !idType.IsUnknownType) {
$dotNetType = idType;
found = true;
}
@ -613,7 +621,7 @@ scope {
TypeRepTemplate thisType = SymTabLookup("this");
// 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)) {
Debug($identifier.tree.Token.Line + ": '" + $identifier.thetext + "' might be a property");
@ -630,7 +638,7 @@ scope {
if (!found) {
// Not a variable, not a property read, is it a type name?
TypeRepTemplate staticType = findType($i.thetext);
if (staticType != null) {
if (!staticType.IsUnknownType) {
AddToImports(staticType.Imports);
$dotNetType = staticType;
found = true;
@ -661,6 +669,9 @@ scope {
AddToImports(conResult.Result.Imports);
$dotNetType = conResult.ResultType;
}
else {
WarningFailedResolve($n.token.Line, "Could not resolve constructor");
}
}
| 'new' (
// 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
{
TypeRepTemplate seType = (isThis ? SymTabLookup("this") : $se.dotNetType);
if (seType != null) {
if (seType != null && !seType.IsUnknownType) {
ResolveResult fieldResult = seType.Resolve($i.thetext, AppEnv);
if (fieldResult != null && fieldResult.Result is 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 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);
if (indexerResult != null) {
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 ;