Exemple #1
0
        public LanguageItemCollection CtrlSpace(IParserContext parserService, int caretLine, int caretColumn, string fileName)
        {
            LanguageItemCollection result = new LanguageItemCollection();

            this.parserService = parserService;
            IParseInformation parseInfo = parserService.GetParseInformation(fileName);

            JRefactory.Parser.AST.CompilationUnit fileCompilationUnit = parseInfo.MostRecentCompilationUnit.Tag as JRefactory.Parser.AST.CompilationUnit;
            if (fileCompilationUnit == null)
            {
                return(null);
            }
            lookupTableVisitor = new LookupTableVisitor();
            lookupTableVisitor.Visit(fileCompilationUnit, null);
            JavaVisitor cSharpVisitor = new JavaVisitor();

            cu = (ICompilationUnit)cSharpVisitor.Visit(fileCompilationUnit, null);
            if (cu != null)
            {
                callingClass = GetInnermostClass();
//				Console.WriteLine("CallingClass is " + callingClass == null ? "null" : callingClass.Name);
            }
            foreach (string name in lookupTableVisitor.variables.Keys)
            {
                ArrayList variables = (ArrayList)lookupTableVisitor.variables[name];
                if (variables != null && variables.Count > 0)
                {
                    foreach (LocalLookupVariable v in variables)
                    {
                        if (IsInside(new Point(caretColumn, caretLine), v.StartPos, v.EndPos))
                        {
                            result.Add(v);
                            break;
                        }
                    }
                }
            }
            if (callingClass != null)
            {
                result = ListMembers(result, callingClass);
            }
            string n = "";

            result.AddRange(parserService.GetNamespaceContents(n));
            foreach (IUsing u in cu.Usings)
            {
                if (u != null && (u.Region == null || u.Region.IsInside(caretLine, caretColumn)))
                {
                    foreach (string name in u.Usings)
                    {
                        result.AddRange(parserService.GetNamespaceContents(name));
                    }
                    foreach (string alias in u.Aliases.Keys)
                    {
                        result.Add(alias);
                    }
                }
            }
            return(result);
        }
Exemple #2
0
        public ResolveResult Resolve(IParserContext parserService, string expression, int caretLineNumber, int caretColumn, string fileName, string fileContent)
        {
            Console.WriteLine("Start Resolving");
            if (expression == null)
            {
                return(null);
            }
            expression = expression.TrimStart(null);
            if (expression == "")
            {
                return(null);
            }
            if (expression.StartsWith("using "))
            {
                // expression[expression.Length - 1] != '.'
                // the period that causes this Resove() is not part of the expression
                if (expression[expression.Length - 1] == '.')
                {
                    return(null);
                }
                int i;
                for (i = expression.Length - 1; i >= 0; --i)
                {
                    if (!(Char.IsLetterOrDigit(expression[i]) || expression[i] == '_' || expression[i] == '.'))
                    {
                        break;
                    }
                }
                // no Identifier before the period
                if (i == expression.Length - 1)
                {
                    return(null);
                }
                string t = expression.Substring(i + 1);
//				Console.WriteLine("in Using Statement");
                string[] namespaces = parserService.GetNamespaceList(t);
                if (namespaces == null || namespaces.Length <= 0)
                {
                    return(null);
                }
                return(new ResolveResult(namespaces));
            }

            Console.WriteLine("Not in Using");
            this.caretLine   = caretLineNumber;
            this.caretColumn = caretColumn;

            this.parserService = parserService;
            IParseInformation parseInfo = parserService.GetParseInformation(fileName);

            JRefactory.Parser.AST.CompilationUnit fileCompilationUnit = parseInfo.MostRecentCompilationUnit.Tag as JRefactory.Parser.AST.CompilationUnit;
            if (fileCompilationUnit == null)
            {
//				JRefactory.Parser.Parser fileParser = new JRefactory.Parser.Parser();
//				fileParser.Parse(new Lexer(new StringReader(fileContent)));
                Console.WriteLine("!Warning: no parseinformation!");
                return(null);
            }

            /*
             * //// try to find last expression in original string, it could be like " if (act!=null) act"
             * //// in this case only "act" should be parsed as expression
             * !!is so!! don't change things that work
             * Expression expr=null;	// tentative expression
             * Lexer l=null;
             * JRefactory.Parser.Parser p = new JRefactory.Parser.Parser();
             * while (expression.Length > 0) {
             *      l = new Lexer(new StringReader(expression));
             *      expr = p.ParseExpression(l);
             *      if (l.LookAhead.val != "" && expression.LastIndexOf(l.LookAhead.val) >= 0) {
             *              if (expression.Substring(expression.LastIndexOf(l.LookAhead.val) + l.LookAhead.val.Length).Length > 0)
             *                      expression=expression.Substring(expression.LastIndexOf(l.LookAhead.val) + l.LookAhead.val.Length).Trim();
             *              else {
             *                      expression=l.LookAhead.val.Trim();
             *                      l=new Lexer(new StringReader(expression));
             *                      expr=p.ParseExpression(l);
             *                      break;
             *              }
             *      } else {
             *              if (l.Token.val!="" || expr!=null) break;
             *      }
             * }
             * //// here last subexpression should be fixed in expr
             * if it should be changed in expressionfinder don't fix it here
             */
            JRefactory.Parser.Parser p = new JRefactory.Parser.Parser();
            Lexer      l    = new Lexer(new StringReader(expression));
            Expression expr = p.ParseExpression(l);

            if (expr == null)
            {
                return(null);
            }
            lookupTableVisitor = new LookupTableVisitor();
            lookupTableVisitor.Visit(fileCompilationUnit, null);

            TypeVisitor typeVisitor = new TypeVisitor(this);

            JavaVisitor cSharpVisitor = new JavaVisitor();

            cu = (ICompilationUnit)cSharpVisitor.Visit(fileCompilationUnit, null);
            if (cu != null)
            {
                callingClass = GetInnermostClass();
                //Console.WriteLine("CallingClass is " + callingClass == null ? "null" : callingClass.Name);
            }
            //Console.WriteLine("expression = " + expr.ToString());
            IReturnType type = expr.AcceptVisitor(typeVisitor, null) as IReturnType;

            //Console.WriteLine("type visited");
            if (type == null || type.PointerNestingLevel != 0)
            {
//				Console.WriteLine("Type == null || type.PointerNestingLevel != 0");
                if (type != null)
                {
                    //Console.WriteLine("PointerNestingLevel is " + type.PointerNestingLevel);
                }
                else
                {
                    //Console.WriteLine("Type == null");
                }
                //// when type is null might be file needs to be reparsed - some vars were lost
                fileCompilationUnit = parserService.ParseFile(fileName, fileContent).MostRecentCompilationUnit.Tag
                                      as JRefactory.Parser.AST.CompilationUnit;
                lookupTableVisitor.Visit(fileCompilationUnit, null);
                cu = (ICompilationUnit)cSharpVisitor.Visit(fileCompilationUnit, null);
                if (cu != null)
                {
                    callingClass = GetInnermostClass();
                }
                type = expr.AcceptVisitor(typeVisitor, null) as IReturnType;
                if (type == null)
                {
                    return(null);
                }
            }
            if (type.ArrayDimensions != null && type.ArrayDimensions.Length > 0)
            {
                type = new ReturnType("System.Array");
            }
            Console.WriteLine("Here: Type is " + type.FullyQualifiedName);
            IClass returnClass = SearchType(type.FullyQualifiedName, cu);

            if (returnClass == null)
            {
                // Try if type is Namespace:
                string n = SearchNamespace(type.FullyQualifiedName, cu);
                if (n == null)
                {
                    return(null);
                }
                ArrayList content = parserService.GetNamespaceContents(n);
                ArrayList classes = new ArrayList();
                for (int i = 0; i < content.Count; ++i)
                {
                    if (content[i] is IClass)
                    {
                        classes.Add((IClass)content[i]);
                    }
                }
                string[] namespaces = parserService.GetNamespaceList(n);
                return(new ResolveResult(namespaces, classes));
            }
            Console.WriteLine("Returning Result!");
            return(new ResolveResult(returnClass, ListMembers(new ArrayList(), returnClass)));
        }
 public override object Visit(AST.CompilationUnit compilationUnit, object data)
 {
     //TODO: usings, Comments
     compilationUnit.AcceptChildren(this, data);
     return(cu);
 }