Browse Source

More C# code completion fixes.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2618 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
a58c7e1f86
  1. 12
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs
  2. 8
      src/Libraries/NRefactory/Project/Src/Lexer/BuildKeywords.pl
  3. 5
      src/Libraries/NRefactory/Project/Src/Lexer/CSharp/KeywordList.txt
  4. 1
      src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Keywords.cs
  5. 3
      src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Tokens.cs
  6. 22
      src/Main/Base/Test/CSharpExpressionFinderTests.cs
  7. 10
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs
  8. 1
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs

12
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs

@ -159,9 +159,15 @@ namespace CSharpBinding @@ -159,9 +159,15 @@ namespace CSharpBinding
case "using":
if (IsInComment(editor)) return false;
// TODO: check if we are inside class/namespace
editor.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(ExpressionContext.Namespace), ' ');
return true;
ParseInformation parseInfo = ParserService.GetParseInformation(editor.FileName);
if (parseInfo != null) {
IClass innerMostClass = parseInfo.MostRecentCompilationUnit.GetInnermostClass(editor.ActiveTextAreaControl.Caret.Line + 1, editor.ActiveTextAreaControl.Caret.Column + 1);
if (innerMostClass == null) {
editor.ShowCompletionWindow(new CtrlSpaceCompletionDataProvider(ExpressionContext.Namespace), ' ');
}
return true;
}
return false;
case "as":
case "is":
if (IsInComment(editor)) return false;

8
src/Libraries/NRefactory/Project/Src/Lexer/BuildKeywords.pl

@ -119,6 +119,14 @@ sub write_keywordfile @@ -119,6 +119,14 @@ sub write_keywordfile
print DAT "\t\t{\n";
print DAT "\t\t\treturn keywords[keyword];\n";
print DAT "\t\t}\n";
print DAT "\t\t\n";
print DAT "\t\tpublic static bool IsNonIdentifierKeyword(string word)\n";
print DAT "\t\t{\n";
print DAT "\t\t\tint token = GetToken(word);\n";
print DAT "\t\t\tif (token < 0)\n";
print DAT "\t\t\t\treturn false;\n";
print DAT "\t\t\treturn !Tokens.IdentifierTokens[token];\n";
print DAT "\t\t}\n";
print DAT "\t}\n";
print DAT "}\n";
close(DAT);

5
src/Libraries/NRefactory/Project/Src/Lexer/CSharp/KeywordList.txt

@ -200,13 +200,14 @@ KCCMemberVisibilityModifiers("protected", "private", "public", "internal") @@ -200,13 +200,14 @@ KCCMemberVisibilityModifiers("protected", "private", "public", "internal")
SimpleTypeName(@TypeKW, @IdentifierTokens, "void")
GlobalLevel("namespace", "using", @KCCTypeDeclarationStart)
ExpressionStart("base", "delegate", "false", "new", "null", "sizeof", "this", "true", "typeof", "checked", "unchecked", "from")
ExpressionContent("as", "is", "out", "ref", "in")
# interfaces cannot have inner classes etc., the only keyword (expect for type names) that may appear in them is "event"
InterfaceLevel("event")
TypeLevel(@KCCTypeDeclarationStart, @KCCMemberVisibilityModifiers, "const", "event", "explicit", "extern", "fixed", "implicit", "operator", "override", "readonly", "virtual", "volatile")
StatementStart(@ExpressionStart, "break", "case", "catch", "checked", "unchecked", "const", "continue", "default", "do", "else", "finally", "fixed", "for", "foreach", "goto", "if", "lock", "return", "stackalloc", "switch", "throw", "try", "unsafe", "using", "while", "yield")
StatementStart(@ExpressionStart, @ExpressionContent, "break", "case", "catch", "checked", "unchecked", "const", "continue", "default", "do", "else", "finally", "fixed", "for", "foreach", "goto", "if", "lock", "return", "stackalloc", "switch", "throw", "try", "unsafe", "using", "while", "yield")
QueryExpressionClauseStart("from", "let", "where", "join", "orderby", "group", "select")
InPropertyDeclaration(@KCCMemberVisibilityModifiers, "get", "set")
InEventDeclaration("add", "remove")
# unused: as, is, out, params, ref, where, in
# unused: where
# "by", "into", "ascending", "descending", "on", "equals"

1
src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Keywords.cs

@ -127,4 +127,3 @@ namespace ICSharpCode.NRefactory.Parser.CSharp @@ -127,4 +127,3 @@ namespace ICSharpCode.NRefactory.Parser.CSharp
}
}
}

3
src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Tokens.cs

@ -183,9 +183,10 @@ namespace ICSharpCode.NRefactory.Parser.CSharp @@ -183,9 +183,10 @@ namespace ICSharpCode.NRefactory.Parser.CSharp
public static BitArray SimpleTypeName = NewSet(Char, Bool, Object, String, Sbyte, Byte, Short, Ushort, Int, Uint, Long, Ulong, Float, Double, Decimal, Identifier, Partial, Where, Get, Set, Add, Remove, Yield, Select, Group, By, Into, From, Ascending, Descending, Orderby, Let, Join, On, Equals, Void);
public static BitArray GlobalLevel = NewSet(Namespace, Using, Public, Internal, Class, Interface, Struct, Enum, Delegate, Abstract, Sealed, Static, Unsafe, Partial);
public static BitArray ExpressionStart = NewSet(Base, Delegate, False, New, Null, Sizeof, This, True, Typeof, Checked, Unchecked, From);
public static BitArray ExpressionContent = NewSet(As, Is, Out, Ref, In);
public static BitArray InterfaceLevel = NewSet(Event);
public static BitArray TypeLevel = NewSet(Public, Internal, Class, Interface, Struct, Enum, Delegate, Abstract, Sealed, Static, Unsafe, Partial, Protected, Private, Public, Internal, Const, Event, Explicit, Extern, Fixed, Implicit, Operator, Override, Readonly, Virtual, Volatile);
public static BitArray StatementStart = NewSet(Base, Delegate, False, New, Null, Sizeof, This, True, Typeof, Checked, Unchecked, From, Break, Case, Catch, Checked, Unchecked, Const, Continue, Default, Do, Else, Finally, Fixed, For, Foreach, Goto, If, Lock, Return, Stackalloc, Switch, Throw, Try, Unsafe, Using, While, Yield);
public static BitArray StatementStart = NewSet(Base, Delegate, False, New, Null, Sizeof, This, True, Typeof, Checked, Unchecked, From, As, Is, Out, Ref, In, Break, Case, Catch, Checked, Unchecked, Const, Continue, Default, Do, Else, Finally, Fixed, For, Foreach, Goto, If, Lock, Return, Stackalloc, Switch, Throw, Try, Unsafe, Using, While, Yield);
public static BitArray QueryExpressionClauseStart = NewSet(From, Let, Where, Join, Orderby, Group, Select);
public static BitArray InPropertyDeclaration = NewSet(Protected, Private, Public, Internal, Get, Set);
public static BitArray InEventDeclaration = NewSet(Add, Remove);

22
src/Main/Base/Test/CSharpExpressionFinderTests.cs

@ -161,11 +161,11 @@ class Main { @@ -161,11 +161,11 @@ class Main {
const string program3 = @"using System; using System.Collections.Generic;
class Main {
void Method(global::System.Exception ex, int arg) {
if (arg < b) {
if (arg < foo1) {
} else if (boolVar) {
} else if (arg > b) {
} else if (arg > foo2) {
}
List<string> a = new
@ -214,19 +214,31 @@ class Main { @@ -214,19 +214,31 @@ class Main {
[Test]
public void ConditionInIfStatement()
{
FindFull(program3, "oolVar)", "boolVar", ExpressionContext.MethodBody);
FindFull(program3, "oolVar)", "boolVar", ExpressionContext.Default);
}
[Test]
public void IdentifierFollowedByLessThan()
{
FindFull(program3, "rg < b", "arg", ExpressionContext.MethodBody);
FindFull(program3, "rg < foo", "arg", ExpressionContext.Default);
}
[Test]
public void IdentifierAfterByLessThan()
{
FindFull(program3, "oo1)", "foo1", ExpressionContext.Default);
}
[Test]
public void IdentifierFollowedByGreaterThan()
{
FindFull(program3, "rg > b", "arg", ExpressionContext.MethodBody);
FindFull(program3, "rg > foo", "arg", ExpressionContext.Default);
}
[Test]
public void IdentifierAfterByGreaterThan()
{
FindFull(program3, "oo2)", "foo2", ExpressionContext.Default);
}
}
}

10
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/ExpressionFinder.cs

@ -53,6 +53,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -53,6 +53,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
Property,
Event,
Statements,
Expression,
Popped
}
@ -291,7 +292,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -291,7 +292,7 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
if (Tokens.ValidInsideTypeName[lastToken]) {
frame = new Frame(frame);
frame.bracketType = '<';
if (frame.parent.type == FrameType.Statements) {
if (frame.parent.type == FrameType.Statements || frame.parent.type == FrameType.Expression) {
frame.SetContext(ExpressionContext.Default);
} else {
frame.SetContext(ExpressionContext.Type);
@ -418,6 +419,13 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -418,6 +419,13 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
frame.parent.childType = FrameType.Statements;
}
break;
case Tokens.If:
case Tokens.While:
case Tokens.Switch:
if (frame.type == FrameType.Statements) {
frame.childType = FrameType.Expression;
}
break;
default:
if (Tokens.SimpleTypeName[token.kind]) {
if (frame.type == FrameType.Interface || frame.type == FrameType.TypeDecl) {

1
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs

@ -1133,6 +1133,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -1133,6 +1133,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
CtrlSpaceInternal(result, fileContent);
} else if (context == ExpressionContext.Default) {
AddCSharpKeywords(result, NR.Parser.CSharp.Tokens.ExpressionStart);
AddCSharpKeywords(result, NR.Parser.CSharp.Tokens.ExpressionContent);
AddCSharpPrimitiveTypes(result);
CtrlSpaceInternal(result, fileContent);
} else {

Loading…
Cancel
Save