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:
parent
f1db436236
commit
590efcda26
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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 ;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user