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);
            }
        }
Exemplo n.º 5
0
	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);
 }
Exemplo n.º 8
0
        //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;
        }