diff options
author | Mike Krüger <mkrueger@xamarin.com> | 2011-11-03 18:39:01 +0400 |
---|---|---|
committer | Mike Krüger <mkrueger@xamarin.com> | 2011-11-03 18:39:01 +0400 |
commit | 08ee6c202fd254c800c60452047e5b126491c790 (patch) | |
tree | 16ad5c9370a5071cf286885d02370e046e2f29e4 /main/contrib | |
parent | aa5abfa76f25949e8ba0769385ad4db39c34a996 (diff) |
[NRefactory] Synced with nrefactory.
Diffstat (limited to 'main/contrib')
4 files changed, 72 insertions, 40 deletions
diff --git a/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 8882cdd848..8559dfc757 100644 --- a/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -44,7 +44,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion #region Additional input properties public CSharpFormattingOptions FormattingPolicy { get; set; } + public string EolMarker { get; set; } + public string IndentString { get; set; } #endregion @@ -419,7 +421,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion char prevCh = offset > 2 ? document.GetCharAt (offset - 2) : '\0'; char nextCh = offset < document.TextLength ? document.GetCharAt (offset) : ' '; - const string allowedChars = ";,[]{}+-*/%^?:&|~!<>="; + const string allowedChars = ";,[](){}+-*/%^?:&|~!<>="; if (!Char.IsWhiteSpace (nextCh) && allowedChars.IndexOf (nextCh) < 0) return null; if (!(Char.IsWhiteSpace (prevCh) || allowedChars.IndexOf (prevCh) >= 0)) @@ -453,7 +455,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion continue; contextList.AddMember (property); } - foreach (var field in initalizerResult.Item1.Type.GetFields (ctx)){ + foreach (var field in initalizerResult.Item1.Type.GetFields (ctx)) { if (!field.IsPublic) continue; contextList.AddMember (field); @@ -630,19 +632,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion foreach (var variable in state.LocalVariables) { wrapper.AddVariable (variable); } - if (state.CurrentMember is IParameterizedMember) { - var param = (IParameterizedMember)state.CurrentMember; + + if (currentMember is IParameterizedMember) { + var param = (IParameterizedMember)currentMember; foreach (var p in param.Parameters) { wrapper.AddVariable (p); } } - if (state.CurrentMember is IMethod) { - var method = (IMethod)state.CurrentMember; + if (currentMember is IMethod) { + var method = (IMethod)currentMember; foreach (var p in method.TypeParameters) { wrapper.AddTypeParameter (p); } } + Predicate<ITypeDefinition> typePred = null; if (node is Attribute) { var attribute = ctx.GetTypeDefinition ("System", "Attribute", 0, StringComparer.Ordinal); @@ -660,7 +664,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion AddKeywords (wrapper, globalLevelKeywords); } - if (IsInSwitchContext(node)) { + if (IsInSwitchContext (node)) { wrapper.AddCustom ("case"); wrapper.AddCustom ("default"); } @@ -669,7 +673,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion wrapper.Result.AddRange (factory.CreateCodeTemplateCompletionData ()); } - static bool IsInSwitchContext(AstNode node) + static bool IsInSwitchContext (AstNode node) { var n = node; while (n != null && !(n is MemberDeclaration)) { @@ -697,7 +701,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } } } - if (currentMember != null) { + if (currentMember != null) { foreach (var member in currentType.Resolve (ctx).GetMembers (ctx)) { if (memberPred == null || memberPred (member)) wrapper.AddMember (member); @@ -751,8 +755,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var wrapper = new CompletionDataWrapper (this); AddTypesAndNamespaces (wrapper, GetState (), null, t => false); return wrapper.Result; - case "case": - return CreateCaseCompletionData (location); + case "case": + return CreateCaseCompletionData (location); // case ",": // case ":": // if (result.ExpressionContext == ExpressionContext.InheritableType) { @@ -989,11 +993,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // } // } // return CreateCtrlSpaceCompletionData (completionContext, null); -// case "if": -// case "elif": -// if (stateTracker.Engine.IsInsidePreprocessorDirective) -// return GetDefineCompletionData (); -// return null; + case "if": + case "elif": + if (wordStart > 0 && document.GetCharAt (wordStart - 1) == '#') + return factory.CreatePreProcessorDefinesCompletionData (); + return null; case "yield": var yieldDataList = new CompletionDataWrapper (this); DefaultCompletionString = "return"; @@ -1051,6 +1055,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return true; } + string GetLineIndent (int lineNr) { var line = document.GetLineByNumber (lineNr); @@ -1160,7 +1165,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (part == type) continue; for (int i = 0; i < methods.Count; i++) { - var curMethod = methods[i]; + var curMethod = methods [i]; var method = GetImplementation (partialType, curMethod); if (method != null && !method.BodyRegion.IsEmpty) { methods.RemoveAt (i); @@ -1184,7 +1189,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (cur.Name == method.Name && cur.Parameters.Count == method.Parameters.Count && !cur.BodyRegion.IsEmpty) { bool equal = true; for (int i = 0; i < cur.Parameters.Count; i++) { - if (!cur.Parameters[i].Type.Resolve (ctx).Equals (method.Parameters[i].Type.Resolve (ctx))) { + if (!cur.Parameters [i].Type.Resolve (ctx).Equals (method.Parameters [i].Type.Resolve (ctx))) { equal = false; break; } @@ -1196,7 +1201,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; } - static string GetNameWithParamCount (IMember member) { var e = member as IMethod; @@ -1546,21 +1550,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (resolvedNode.Annotation<ObjectCreateExpression> () == null) { //tags the created expression as part of an object create expression. foreach (var member in type.GetMembers (ctx)) { if (!lookup.IsAccessible (member, isProtectedAllowed)) { - // Console.WriteLine ("skip access: " + member.FullName); + // Console.WriteLine ("skip access: " + member.FullName); continue; } if (resolvedNode is BaseReferenceExpression && member.IsAbstract) continue; if (!includeStaticMembers && member.IsStatic && !(resolveResult is TypeResolveResult)) { - // Console.WriteLine ("skip static member: " + member.FullName); + // Console.WriteLine ("skip static member: " + member.FullName); continue; } if (!member.IsStatic && (resolveResult is TypeResolveResult)) { - // Console.WriteLine ("skip non static member: " + member.FullName); + // Console.WriteLine ("skip non static member: " + member.FullName); continue; } - // Console.WriteLine ("add : "+ member.FullName + " --- " + member.IsStatic); + // Console.WriteLine ("add : "+ member.FullName + " --- " + member.IsStatic); result.AddMember (member); } } @@ -1620,6 +1624,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } } } + IEnumerable<ICompletionData> CreateCaseCompletionData (TextLocation location) { var unit = ParseStub ("a: break;"); @@ -1677,7 +1682,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; var mref = baseUnit.GetNodeAt<MemberReferenceExpression> (location); - if (mref == null){ + if (mref == null) { var invoke = baseUnit.GetNodeAt<InvocationExpression> (location); if (invoke != null) mref = invoke.Target as MemberReferenceExpression; @@ -1690,7 +1695,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion Expression tref = baseUnit.GetNodeAt<TypeReferenceExpression> (location); var memberType = tref != null ? ((TypeReferenceExpression)tref).Type as MemberType : null; if (memberType == null) { - memberType = baseUnit.GetNodeAt<MemberType> (location); + memberType = baseUnit.GetNodeAt<MemberType> (location); if (memberType != null) { tref = baseUnit.GetNodeAt<Expression> (location); if (tref == null) @@ -1728,7 +1733,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion memberLocation = currentMember.Region.Begin; } else if (currentType != null) { memberLocation = currentType.Region.Begin; - } else { + } else { memberLocation = location; } @@ -1809,7 +1814,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return Tuple.Create (tsvisitor.ParsedFile, expr, completionUnit); } - Tuple<CSharpParsedFile, AstNode, CompilationUnit> GetNewExpressionAt (int offset) { var parser = new CSharpParser (); @@ -2052,25 +2056,20 @@ namespace ICSharpCode.NRefactory.CSharp.Completion #region Keywords static string[] expressionLevelKeywords = new string [] { "as", "is", "else", "out", "ref", "null", "delegate", "default"}; - static string[] primitiveTypesKeywords = new string [] { "void", "object", "bool", "byte", "sbyte", "char", "short", "int", "long", "ushort", "uint", "ulong", "float", "double", "decimal", "string"}; - static string[] statementStartKeywords = new string [] { "base", "new", "sizeof", "this", "true", "false", "typeof", "checked", "unchecked", "from", "break", "checked", "unchecked", "const", "continue", "do", "finally", "fixed", "for", "foreach", "goto", "if", "lock", "return", "stackalloc", "switch", "throw", "try", "unsafe", "using", "while", "yield", "dynamic", "var" }; - static string[] globalLevelKeywords = new string [] { "namespace", "using", "extern", "public", "internal", "class", "interface", "struct", "enum", "delegate", "abstract", "sealed", "static", "unsafe", "partial" }; - static string[] accessorModifierKeywords = new string [] { "public", "internal", "protected", "private" }; - static string[] typeLevelKeywords = new string [] { "public", "internal", "protected", "private", "class", "interface", "struct", "enum", "delegate", diff --git a/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 17c77582d1..9147c7cc71 100644 --- a/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -44,14 +44,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion protected IDocument document; protected int offset; protected TextLocation location; - protected ITypeDefinition currentType; protected IMember currentMember; #region Input properties public ITypeResolveContext ctx { get; set; } + public CompilationUnit Unit { get; set; } + public CSharpParsedFile CSharpParsedFile { get; set; } + public IProjectContent ProjectContent { get; set; } #endregion @@ -70,7 +72,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion currentMember = member; } } - var stack = GetBracketStack (GetMemberTextToCaret ().Item1); if (stack.Count == 0) currentMember = null; @@ -83,8 +84,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion bool inSingleComment = false, inString = false, inVerbatimString = false, inChar = false, inMultiLineComment = false; for (int i = 0; i < text.Item1.Length - 1; i++) { - char ch = text.Item1[i]; - char nextCh = text.Item1[i + 1]; + char ch = text.Item1 [i]; + char nextCh = text.Item1 [i + 1]; switch (ch) { case '/': @@ -257,9 +258,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion bool didAppendCatch = false; while (o >= "try".Length) { - char ch = memberText[o]; + char ch = memberText [o]; if (!char.IsWhiteSpace (ch)) { - if (ch == 'y' && memberText[o - 1] == 'r' && memberText[o - 2] == 't') { + if (ch == 'y' && memberText [o - 1] == 'r' && memberText [o - 2] == 't') { wrapper.Append ("} catch {}"); didAppendCatch = true; } @@ -373,7 +374,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; } - /* var member = Unit.GetNodeAt<AttributedNode> (memberLocation); + /* var member = Unit.GetNodeAt<AttributedNode> (memberLocation); var member2 = baseUnit.GetNodeAt<AttributedNode> (memberLocation); member2.Remove (); member.ReplaceWith (member2); diff --git a/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index 6aaa6716ea..57f25b5352 100644 --- a/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -75,7 +75,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; SetOffset (offset); char completionChar = document.GetCharAt (offset - 1); - if (completionChar != '(' && completionChar != '<' && completionChar != '[') + if (completionChar != '(' && completionChar != '<' && completionChar != '[' && completionChar != ',') return null; if (IsInsideCommentOrString ()) return null; @@ -126,7 +126,37 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // return new NRefactoryParameterDataProvider (textEditorData, result.Expression, resolvedType); // } break; + case ',': + if (invoke.Item2 is ObjectCreateExpression) { + var createType = ResolveExpression (invoke.Item1, ((ObjectCreateExpression)invoke.Item2).Type, invoke.Item3); + return factory.CreateConstructorProvider (createType.Item1.Type); + } + + if (invoke.Item2 is ICSharpCode.NRefactory.CSharp.Attribute) { + var attribute = ResolveExpression (invoke.Item1, invoke.Item2, invoke.Item3); + if (attribute == null || attribute.Item1 == null) + return null; + return factory.CreateConstructorProvider (attribute.Item1.Type); + } + + invocationExpression = ResolveExpression (invoke.Item1, invoke.Item2, invoke.Item3); + + if (invocationExpression == null || invocationExpression.Item1 == null || invocationExpression.Item1.IsError) + return null; + resolveResult = invocationExpression.Item1; + if (resolveResult is MethodGroupResolveResult) + return factory.CreateMethodDataProvider (resolveResult as MethodGroupResolveResult); + if (resolveResult is MemberResolveResult) { + if (resolveResult.Type.Kind == TypeKind.Delegate) + return factory.CreateDelegateDataProvider (resolveResult.Type); + var mr = resolveResult as MemberResolveResult; + if (mr.Member is IMethod) + return factory.CreateMethodDataProvider ((IMethod)mr.Member); + } + if (resolveResult != null) + return factory.CreateIndexerParameterDataProvider (resolveResult.Type, invoke.Item2); + break; // case '<': // if (string.IsNullOrEmpty (result.Expression)) // return null; diff --git a/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/ICompletionDataFactory.cs b/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/ICompletionDataFactory.cs index 48cf01dcc6..cf8f4960cf 100644 --- a/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/ICompletionDataFactory.cs +++ b/main/contrib/ICSharpCode.NRefactory.CSharp/Completion/ICompletionDataFactory.cs @@ -63,5 +63,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion ICompletionData CreateNewOverrideCompletionData (int declarationBegin, ITypeDefinition type, IMember m); IEnumerable<ICompletionData> CreateCodeTemplateCompletionData (); + + IEnumerable<ICompletionData> CreatePreProcessorDefinesCompletionData (); } } |