bool IsQualIdent(FieldReferenceOrInvocationExpression fieldReferenceExpression) { while (fieldReferenceExpression.TargetObject is FieldReferenceOrInvocationExpression) { fieldReferenceExpression = (FieldReferenceOrInvocationExpression)fieldReferenceExpression.TargetObject; } return fieldReferenceExpression.TargetObject is IdentifierExpression; }
CodeTypeReferenceExpression ConvertToIdentifier(FieldReferenceOrInvocationExpression fieldReferenceExpression) { string type = String.Empty; while (fieldReferenceExpression.TargetObject is FieldReferenceOrInvocationExpression) { type = "." + fieldReferenceExpression.FieldName + type; fieldReferenceExpression = (FieldReferenceOrInvocationExpression)fieldReferenceExpression.TargetObject; } type = "." + fieldReferenceExpression.FieldName + type; if (fieldReferenceExpression.TargetObject is IdentifierExpression) { type = ((IdentifierExpression)fieldReferenceExpression.TargetObject).Identifier + type; string oldType = type; int idx = type.LastIndexOf('.'); while (idx >= 0) { if (Type.GetType(type) != null) { break; } type = type.Substring(0, idx) + "+" + type.Substring(idx + 1); idx = type.LastIndexOf('.'); } if (Type.GetType(type) == null) { type = oldType; } return new CodeTypeReferenceExpression(type); } else { throw new Exception(); } }
bool IsFieldReferenceExpression(FieldReferenceOrInvocationExpression fieldReferenceExpression) { if (fieldReferenceExpression.TargetObject is ThisReferenceExpression) { foreach (object o in this.currentTypeDeclaration.Children) { if (o is FieldDeclaration) { FieldDeclaration fd = (FieldDeclaration)o; foreach (VariableDeclaration field in fd.Fields) { if (fieldReferenceExpression.FieldName.ToUpper() == field.Name.ToUpper()) { return true; } } } } } return false; //Char.IsLower(fieldReferenceExpression.FieldName[0]); }
public override object Visit(FieldReferenceOrInvocationExpression fieldReferenceExpression, object data) { if (methodReference) { methodReference = false; return new CodeMethodReferenceExpression((CodeExpression)fieldReferenceExpression.TargetObject.AcceptVisitor(this, data), fieldReferenceExpression.FieldName); } if (IsFieldReferenceExpression(fieldReferenceExpression)) { return new CodeFieldReferenceExpression((CodeExpression)fieldReferenceExpression.TargetObject.AcceptVisitor(this, data), fieldReferenceExpression.FieldName); } else { if (fieldReferenceExpression.TargetObject is FieldReferenceOrInvocationExpression) { if (IsQualIdent((FieldReferenceOrInvocationExpression)fieldReferenceExpression.TargetObject)) { CodeTypeReferenceExpression typeRef = ConvertToIdentifier((FieldReferenceOrInvocationExpression)fieldReferenceExpression.TargetObject); if (IsField(typeRef.Type.BaseType, fieldReferenceExpression.FieldName)) { return new CodeFieldReferenceExpression(typeRef, fieldReferenceExpression.FieldName); } else { return new CodePropertyReferenceExpression(typeRef, fieldReferenceExpression.FieldName); } } } CodeExpression codeExpression = (CodeExpression)fieldReferenceExpression.TargetObject.AcceptVisitor(this, data); return new CodePropertyReferenceExpression(codeExpression, fieldReferenceExpression.FieldName); } }
void SimpleExpr( #line 1493 "VBNET.ATG" out Expression pexpr) { #line 1495 "VBNET.ATG" Expression expr; TypeReference type = null; string name = String.Empty; pexpr = null; if (StartOf(20)) { switch (la.kind) { case 3: { lexer.NextToken(); #line 1503 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 4: { lexer.NextToken(); #line 1504 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 7: { lexer.NextToken(); #line 1505 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 6: { lexer.NextToken(); #line 1506 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 5: { lexer.NextToken(); #line 1507 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 9: { lexer.NextToken(); #line 1508 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 8: { lexer.NextToken(); #line 1509 "VBNET.ATG" pexpr = new PrimitiveExpression(t.literalValue, t.val); break; } case 175: { lexer.NextToken(); #line 1511 "VBNET.ATG" pexpr = new PrimitiveExpression(true, "true"); break; } case 97: { lexer.NextToken(); #line 1512 "VBNET.ATG" pexpr = new PrimitiveExpression(false, "false"); break; } case 131: { lexer.NextToken(); #line 1513 "VBNET.ATG" pexpr = new PrimitiveExpression(null, "null"); break; } case 25: { lexer.NextToken(); Expr( #line 1514 "VBNET.ATG" out expr); Expect(26); #line 1514 "VBNET.ATG" pexpr = new ParenthesizedExpression(expr); break; } case 2: case 52: case 71: case 171: { Identifier(); #line 1515 "VBNET.ATG" pexpr = new IdentifierExpression(t.val); break; } case 53: case 55: case 66: case 77: case 78: case 85: case 112: case 118: case 161: case 162: case 167: { #line 1516 "VBNET.ATG" string val = String.Empty; PrimitiveTypeName( #line 1516 "VBNET.ATG" out val); Expect(10); Identifier(); #line 1517 "VBNET.ATG" pexpr = new FieldReferenceOrInvocationExpression(new TypeReferenceExpression(val), t.val); break; } case 120: { lexer.NextToken(); #line 1518 "VBNET.ATG" pexpr = new ThisReferenceExpression(); break; } case 125: case 126: { #line 1519 "VBNET.ATG" Expression retExpr = null; if (la.kind == 125) { lexer.NextToken(); #line 1520 "VBNET.ATG" retExpr = new BaseReferenceExpression(); } else if (la.kind == 126) { lexer.NextToken(); #line 1521 "VBNET.ATG" retExpr = new ClassReferenceExpression(); } else SynErr(217); Expect(10); IdentifierOrKeyword( #line 1523 "VBNET.ATG" out name); #line 1523 "VBNET.ATG" pexpr = new FieldReferenceOrInvocationExpression(retExpr, name); break; } case 128: { ObjectCreateExpression( #line 1524 "VBNET.ATG" out expr); #line 1524 "VBNET.ATG" pexpr = expr; break; } case 76: case 83: { if (la.kind == 83) { lexer.NextToken(); } else if (la.kind == 76) { lexer.NextToken(); } else SynErr(218); Expect(25); Expr( #line 1525 "VBNET.ATG" out expr); Expect(12); TypeName( #line 1525 "VBNET.ATG" out type); Expect(26); #line 1525 "VBNET.ATG" pexpr = new CastExpression(type, expr); break; } case 60: case 61: case 62: case 63: case 64: case 65: case 67: case 69: case 70: case 73: case 74: case 75: { CastTarget( #line 1526 "VBNET.ATG" out type); Expect(25); Expr( #line 1526 "VBNET.ATG" out expr); Expect(26); #line 1526 "VBNET.ATG" pexpr = new CastExpression(type, expr, true); break; } case 44: { lexer.NextToken(); Expr( #line 1527 "VBNET.ATG" out expr); #line 1527 "VBNET.ATG" pexpr = new AddressOfExpression(expr); break; } case 103: { lexer.NextToken(); Expect(25); TypeName( #line 1528 "VBNET.ATG" out type); Expect(26); #line 1528 "VBNET.ATG" pexpr = new GetTypeExpression(type); break; } case 177: { lexer.NextToken(); SimpleExpr( #line 1529 "VBNET.ATG" out expr); Expect(114); TypeName( #line 1529 "VBNET.ATG" out type); #line 1529 "VBNET.ATG" pexpr = new TypeOfExpression(expr, type); break; } } while (la.kind == 10 || la.kind == 25) { if (la.kind == 10) { lexer.NextToken(); IdentifierOrKeyword( #line 1532 "VBNET.ATG" out name); #line 1532 "VBNET.ATG" pexpr = new FieldReferenceOrInvocationExpression(pexpr, name); } else { lexer.NextToken(); #line 1533 "VBNET.ATG" ArrayList parameters = new ArrayList(); if (StartOf(21)) { #line 1535 "VBNET.ATG" expr = null; if (StartOf(18)) { Argument( #line 1535 "VBNET.ATG" out expr); } #line 1535 "VBNET.ATG" parameters.Add(expr); while (la.kind == 12) { lexer.NextToken(); #line 1537 "VBNET.ATG" expr = null; if (StartOf(18)) { Argument( #line 1538 "VBNET.ATG" out expr); } #line 1538 "VBNET.ATG" parameters.Add(expr); } } Expect(26); #line 1541 "VBNET.ATG" pexpr = new InvocationExpression(pexpr, parameters); } } } else if (la.kind == 10) { lexer.NextToken(); IdentifierOrKeyword( #line 1545 "VBNET.ATG" out name); #line 1545 "VBNET.ATG" pexpr = new FieldReferenceOrInvocationExpression(pexpr, name); while (la.kind == 10 || la.kind == 25) { if (la.kind == 10) { lexer.NextToken(); IdentifierOrKeyword( #line 1547 "VBNET.ATG" out name); #line 1547 "VBNET.ATG" pexpr = new FieldReferenceOrInvocationExpression(pexpr, name); } else { lexer.NextToken(); #line 1548 "VBNET.ATG" ArrayList parameters = new ArrayList(); if (StartOf(21)) { #line 1550 "VBNET.ATG" expr = null; if (StartOf(18)) { Argument( #line 1550 "VBNET.ATG" out expr); } #line 1550 "VBNET.ATG" parameters.Add(expr); while (la.kind == 12) { lexer.NextToken(); #line 1552 "VBNET.ATG" expr = null; if (StartOf(18)) { Argument( #line 1553 "VBNET.ATG" out expr); } #line 1553 "VBNET.ATG" parameters.Add(expr); } } Expect(26); #line 1556 "VBNET.ATG" pexpr = new InvocationExpression(pexpr, parameters); } } } else SynErr(219); }
public object Visit(FieldReferenceOrInvocationExpression fieldReferenceOrInvocationExpression, object data) { DebugOutput(fieldReferenceOrInvocationExpression); INode target = fieldReferenceOrInvocationExpression.TargetObject; if (target == null && withExpressionStack.Count > 0) { target = withExpressionStack.Peek() as INode; } return String.Concat(target.AcceptVisitor(this, data), '.', fieldReferenceOrInvocationExpression.FieldName); }
public virtual object Visit(FieldReferenceOrInvocationExpression fieldReferenceOrInvocationExpression, object data) { if (fieldReferenceOrInvocationExpression.TargetObject == null) { return null; } return fieldReferenceOrInvocationExpression.TargetObject.AcceptVisitor(this, data); }
//TODO - Verify logic; did a lot of "just make it work" hacking in this method public override object Visit(FieldReferenceOrInvocationExpression fieldReferenceExpression, object data) { if (fieldReferenceExpression == null) { return null; } IReturnType returnType = fieldReferenceExpression.TargetObject.AcceptVisitor(this, data) as IReturnType; if (returnType != null) { //Console.WriteLine("Got type: " + returnType.FullyQualifiedName); string name = resolver.SearchNamespace(returnType.FullyQualifiedName, resolver.CompilationUnit); if (name != null) { //Console.WriteLine("Got subtype: " + name + "." + fieldReferenceExpression.FieldName); string n = resolver.SearchNamespace(string.Concat(name, ".", fieldReferenceExpression.FieldName), null); if (n != null) { return new ReturnType(n); } //Console.WriteLine("Trying classes"); IClass c = resolver.SearchType(string.Concat(name, ".", fieldReferenceExpression.FieldName), resolver.CallingClass, resolver.CompilationUnit); //IClass c = resolver.SearchType(string.Concat(name, ".", fieldReferenceExpression.FieldName), resolver.CompilationUnit); if (c != null) { resolver.ShowStatic = true; return new ReturnType(c.FullyQualifiedName); } //FIXME? try{ return new ReturnType(name + "." + fieldReferenceExpression.FieldName); }catch(Exception ex){ return null; } } //Console.WriteLine("Trying Members"); return resolver.SearchMember(returnType, fieldReferenceExpression.FieldName); } // Console.WriteLine("returnType of child is null!"); return null; }