ExpressionContext GetCreationContext()
 {
     UnGetToken();
     if (GetNextNonWhiteSpace() == '=')               // was: "= new"
     {
         ReadNextToken();
         if (curTokenType == Ident)                       // was: "ident = new"
         {
             int typeEnd = offset;
             ReadNextToken();
             int typeStart = -1;
             while (curTokenType == Ident)
             {
                 typeStart = offset + 1;
                 ReadNextToken();
                 if (curTokenType == Dot)
                 {
                     ReadNextToken();
                 }
                 else
                 {
                     break;
                 }
             }
             if (typeStart >= 0)
             {
                 string className = text.Substring(typeStart, typeEnd - typeStart);
                 int    pos = className.IndexOf('<');
                 string nonGenericClassName, genericPart;
                 int    typeParameterCount = 0;
                 if (pos > 0)
                 {
                     nonGenericClassName = className.Substring(0, pos);
                     genericPart         = className.Substring(pos);
                     pos = 0;
                     do
                     {
                         typeParameterCount += 1;
                         pos = genericPart.IndexOf(',', pos + 1);
                     } while (pos > 0);
                 }
                 else
                 {
                     nonGenericClassName = className;
                     genericPart         = null;
                 }
                 ClassFinder finder = new ClassFinder(fileName, text, typeStart);
                 IReturnType t      = finder.SearchType(nonGenericClassName, typeParameterCount);
                 IClass      c      = (t != null) ? t.GetUnderlyingClass() : null;
                 if (c != null)
                 {
                     ExpressionContext context = ExpressionContext.TypeDerivingFrom(c.BaseType, true);
                     if (context.ShowEntry(c))
                     {
                         if (genericPart != null)
                         {
                             DefaultClass genericClass = new DefaultClass(c.CompilationUnit, c.ClassType, c.Modifiers, c.Region, c.DeclaringType);
                             genericClass.FullyQualifiedName = c.FullyQualifiedName + genericPart;
                             genericClass.Documentation      = c.Documentation;
                             context.SuggestedItem           = genericClass;
                         }
                         else
                         {
                             context.SuggestedItem = c;
                         }
                     }
                     return(context);
                 }
             }
         }
     }
     else
     {
         UnGet();
         if (ReadIdentifier(GetNextNonWhiteSpace()) == "throw")
         {
             return(ExpressionContext.TypeDerivingFrom(HostCallback.GetCurrentProjectContent().GetClass("System.Exception", 1).BaseType, true));
         }
     }
     return(ExpressionContext.ObjectCreation);
 }
 ExpressionResult CreateResult(string expression, string inText, int offset)
 {
     if (expression == null)
     {
         return(new ExpressionResult(null));
     }
     if (expression.StartsWith("using "))
     {
         return(new ExpressionResult(expression.Substring(6).TrimStart(), ExpressionContext.Namespace, null));
     }
     if (!hadParenthesis && expression.StartsWith("new "))
     {
         return(new ExpressionResult(expression.Substring(4).TrimStart(), GetCreationContext(), null));
     }
     if (IsInAttribute(inText, offset))
     {
         return(new ExpressionResult(expression, ExpressionContext.GetAttribute(HostCallback.GetCurrentProjectContent())));
     }
     return(new ExpressionResult(expression));
 }