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-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)
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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 ;
|
||||
|
Loading…
x
Reference in New Issue
Block a user