Browse Source

- implemented ObjectCreation and Type context

- fixed bugs in ExpressionFinder

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/vbnet@6117 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
cca4d61806
  1. 47
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/CompletionDataHelper.cs
  2. 11
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs
  3. 2
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Block.cs
  4. 45
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.atg
  5. 2
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.cs
  6. 1
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs
  7. 4424
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Parser.cs
  8. 12
      src/Libraries/NRefactory/Test/Lexer/VBNet/LexerContextTests.cs
  9. 28
      src/Main/Base/Test/VBExpressionFinderTests.cs
  10. 1
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryResolver.cs
  11. 24
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetExpressionFinder.cs

47
src/AddIns/BackendBindings/VBNetBinding/Project/Src/CompletionDataHelper.cs

@ -21,9 +21,9 @@ namespace ICSharpCode.VBNetBinding @@ -21,9 +21,9 @@ namespace ICSharpCode.VBNetBinding
{
public static class CompletionDataHelper
{
public static ICompletionItemList GenerateCompletionData(this ExpressionResult expressionResult, ITextEditor editor)
public static ICompletionItemList GenerateCompletionData(this ExpressionResult expressionResult, ITextEditor editor, char pressedKey)
{
var result = new NRefactoryCompletionItemList();
DefaultCompletionItemList result = new NRefactoryCompletionItemList();
IResolver resolver = ParserService.CreateResolver(editor.FileName);
ParseInformation info = ParserService.GetParseInformation(editor.FileName);
@ -33,12 +33,12 @@ namespace ICSharpCode.VBNetBinding @@ -33,12 +33,12 @@ namespace ICSharpCode.VBNetBinding
List<ICompletionEntry> data = new List<ICompletionEntry>();
if (string.IsNullOrEmpty(expressionResult.Expression)) {
if (expressionResult.Context != ExpressionContext.Global && expressionResult.Context != ExpressionContext.TypeDeclaration) {
if (string.IsNullOrEmpty(expressionResult.Expression) || IdentifierExpected(expressionResult.Tag)) {
data = new NRefactoryResolver(LanguageProperties.VBNet)
.CtrlSpace(editor.Caret.Line, editor.Caret.Column, info, editor.Document.Text, expressionResult.Context, result.ContainsItemsFromAllNamespaces);
.CtrlSpace(editor.Caret.Line, editor.Caret.Column, info, editor.Document.Text, expressionResult.Context, ((NRefactoryCompletionItemList)result).ContainsItemsFromAllNamespaces);
} else {
if (expressionResult.Context != ExpressionContext.Global && expressionResult.Context != ExpressionContext.TypeDeclaration) {
if (expressionResult.Context == ExpressionContext.Importable && expressionResult.Expression == "Imports") {
if (expressionResult.Context == ExpressionContext.Importable && expressionResult.Expression.Equals("Imports", StringComparison.OrdinalIgnoreCase)) {
expressionResult.Expression = "Global";
}
@ -47,14 +47,33 @@ namespace ICSharpCode.VBNetBinding @@ -47,14 +47,33 @@ namespace ICSharpCode.VBNetBinding
if (rr == null)
return result;
data = rr.GetCompletionData(info.CompilationUnit.ProjectContent, result.ContainsItemsFromAllNamespaces);
data = rr.GetCompletionData(info.CompilationUnit.ProjectContent, ((NRefactoryCompletionItemList)result).ContainsItemsFromAllNamespaces);
}
}
if (expressionResult.Tag != null && (expressionResult.Context != ExpressionContext.Importable))
bool addedKeywords = false;
if (expressionResult.Tag != null && (expressionResult.Context != ExpressionContext.Importable) && pressedKey != '.') {
AddVBNetKeywords(data, (BitArray)expressionResult.Tag);
if (((BitArray)expressionResult.Tag)[Tokens.New])
data.Add(new KeywordEntry("New"));
addedKeywords = true;
}
result = CodeCompletionItemProvider.ConvertCompletionData(result, data, expressionResult.Context);
if (addedKeywords)
AddTemplates(editor, result);
return CodeCompletionItemProvider.ConvertCompletionData(result, data, expressionResult.Context);
return result;
}
static bool IdentifierExpected(object tag)
{
if (tag is BitArray)
return (tag as BitArray)[2];
return false;
}
static void AddVBNetKeywords(List<ICompletionEntry> ar, BitArray keywords)
@ -65,5 +84,15 @@ namespace ICSharpCode.VBNetBinding @@ -65,5 +84,15 @@ namespace ICSharpCode.VBNetBinding
}
}
}
static void AddTemplates(ITextEditor editor, DefaultCompletionItemList list)
{
if (list == null)
return;
List<ICompletionItem> snippets = editor.GetSnippets().ToList();
list.Items.RemoveAll(item => item.Image == ClassBrowserIconService.Keyword && snippets.Exists(i => i.Text == item.Text));
list.Items.AddRange(snippets);
list.SortItems();
}
}
}

11
src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs

@ -61,17 +61,18 @@ namespace ICSharpCode.VBNetBinding @@ -61,17 +61,18 @@ namespace ICSharpCode.VBNetBinding
break;
case '"':
case '\n':
case ')':
break;
case '.':
result = ef.FindExpression(editor.Document.Text, editor.Caret.Offset);
LoggingService.Debug("CC: After dot, result=" + result + ", context=" + result.Context);
editor.ShowCompletionWindow(CompletionDataHelper.GenerateCompletionData(result, editor));
editor.ShowCompletionWindow(CompletionDataHelper.GenerateCompletionData(result, editor, ch));
return CodeCompletionKeyPressResult.Completed;
case ' ':
result = ef.FindExpression(editor.Document.Text, editor.Caret.Offset);
if (HasKeywordsOnly(result.Tag as BitArray) || result.Context == ExpressionContext.Importable) {
if (HasKeywordsOnly(result.Tag as BitArray) || result.Context == ExpressionContext.Importable || result.Context == ExpressionContext.Type || result.Context == ExpressionContext.ObjectCreation) {
LoggingService.Debug("CC: After space, result=" + result + ", context=" + result.Context);
editor.ShowCompletionWindow(CompletionDataHelper.GenerateCompletionData(result, editor));
editor.ShowCompletionWindow(CompletionDataHelper.GenerateCompletionData(result, editor, ch));
return CodeCompletionKeyPressResult.Completed;
}
break;
@ -90,7 +91,7 @@ namespace ICSharpCode.VBNetBinding @@ -90,7 +91,7 @@ namespace ICSharpCode.VBNetBinding
if ((result.Context != ExpressionContext.IdentifierExpected) &&
(!char.IsLetterOrDigit(prevChar) && prevChar != '.')) {
LoggingService.Debug("CC: Beginning to type a word, result=" + result + ", context=" + result.Context);
editor.ShowCompletionWindow(CompletionDataHelper.GenerateCompletionData(result, editor));
editor.ShowCompletionWindow(CompletionDataHelper.GenerateCompletionData(result, editor, ch));
return CodeCompletionKeyPressResult.CompletedIncludeKeyInCompletion;
}
}
@ -182,7 +183,7 @@ namespace ICSharpCode.VBNetBinding @@ -182,7 +183,7 @@ namespace ICSharpCode.VBNetBinding
ExpressionResult result = ef.FindExpression(editor.Document.Text, cursor);
LoggingService.Debug("CC: Beginning to type a word, result=" + result + ", context=" + result.Context);
if (result.Context != ExpressionContext.IdentifierExpected) {
editor.ShowCompletionWindow(CompletionDataHelper.GenerateCompletionData(result, editor));
editor.ShowCompletionWindow(CompletionDataHelper.GenerateCompletionData(result, editor, ' '));
return true;
}
}

2
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Block.cs

@ -16,6 +16,8 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -16,6 +16,8 @@ namespace ICSharpCode.NRefactory.Parser.VB
{
Global,
TypeDeclaration,
ObjectCreation,
Type,
Member,
IdentifierExpected,
Body,

45
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.atg

@ -322,7 +322,7 @@ TypeDeclaration = @@ -322,7 +322,7 @@ TypeDeclaration =
ClassOrModuleOrStructureTypeDeclaration =
( "Module" | "Class" | "Structure" ) (. PushContext(Context.IdentifierExpected, la, t); .) ANY (. PopContext(); .)
[ "(" "Of" [ "Out" | "In" ] IdentifierExceptOut [ "As" GenericConstraintList ] { "," [ "Out" | "In" ] IdentifierExceptOut [ "As" GenericConstraintList ] } ")" ] { ANY } [ StatementTerminator ]
[ "(" "Of" [ "Out" | "In" ] IdentifierExceptOut [ (. PushContext(Context.Type, la, t); .) "As" GenericConstraintList (. PopContext(); .) ] { "," [ "Out" | "In" ] IdentifierExceptOut [ (. PushContext(Context.Type, la, t); .) "As" GenericConstraintList (. PopContext(); .) ] } ")" ] { ANY } [ StatementTerminator ]
[ "Inherits" { ANY } StatementTerminator ]
[ "Implements" { ANY } StatementTerminator ]
(. PushContext(Context.TypeDeclaration, la, t); .)
@ -342,7 +342,7 @@ GenericConstraintList = @@ -342,7 +342,7 @@ GenericConstraintList =
DelegateTypeDeclaration =
"Delegate" ("Sub" | "Function")
(. PushContext(Context.IdentifierExpected, la, t); .) ANY (. PopContext(); .)
[ "(" [ ParameterList ] ")" ] [ "As" TypeName ] StatementTerminator
[ "(" [ ParameterList ] ")" ] [ (. PushContext(Context.Type, la, t); .) "As" TypeName (. PopContext(); .) ] StatementTerminator
.
MemberDeclaration =
@ -362,18 +362,18 @@ MemberDeclaration = @@ -362,18 +362,18 @@ MemberDeclaration =
SubOrFunctionDeclaration =
("Sub" | "Function")
(. PushContext(Context.IdentifierExpected, la, t); .) ANY (. PopContext(); .)
[ "(" [ ParameterList ] ")" ] [ "As" TypeName ]
[ "(" [ ParameterList ] ")" ] [ (. PushContext(Context.Type, la, t); .) "As" TypeName (. PopContext(); .) ]
StatementTerminatorAndBlock
"End" ("Sub" | "Function") StatementTerminator
.
ExternalMemberDeclaration =
"Declare" [ "Ansi" | "Unicode" | "Auto" ] ( "Sub" | "Function" ) (. PushContext(Context.IdentifierExpected, la, t); .) Identifier (. PopContext(); .)
"Lib" LiteralString [ "Alias" LiteralString ] [ "(" [ ParameterList ] ")" ] [ "As" TypeName ] StatementTerminator
"Lib" LiteralString [ "Alias" LiteralString ] [ "(" [ ParameterList ] ")" ] [ (. PushContext(Context.Type, la, t); .) "As" TypeName (. PopContext(); .) ] StatementTerminator
.
EventMemberDeclaration =
"Event" (. PushContext(Context.IdentifierExpected, la, t); .) Identifier (. PopContext(); .) ( "As" TypeName | [ "(" [ ParameterList ] ")" ] )
"Event" (. PushContext(Context.IdentifierExpected, la, t); .) Identifier (. PopContext(); .) ( (. PushContext(Context.Type, la, t); .) "As" TypeName (. PopContext(); .) | [ "(" [ ParameterList ] ")" ] )
[ "Implements" TypeName /*"." IdentifierOrKeyword*/ { "," TypeName /*"." IdentifierOrKeyword*/ } ]
/* the TypeName production already allows the "." IdentifierOrKeyword syntax, so to avoid an ambiguous grammer we just leave that out */
StatementTerminator
@ -390,14 +390,14 @@ CustomEventMemberDeclaration = @@ -390,14 +390,14 @@ CustomEventMemberDeclaration =
.
OperatorDeclaration =
"Operator" (. PushContext(Context.IdentifierExpected, la, t); .) ANY (. PopContext(); .) "(" ParameterList ")" [ "As" { AttributeBlock } TypeName ]
"Operator" (. PushContext(Context.IdentifierExpected, la, t); .) ANY (. PopContext(); .) "(" ParameterList ")" [ "As" { AttributeBlock } (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ]
StatementTerminatorAndBlock
"End" "Operator" StatementTerminator
.
MemberVariableOrConstantDeclaration =
[ "Const" ]
(. PushContext(Context.IdentifierExpected, la, t); .) IdentifierForFieldDeclaration (. PopContext(); .) [ "As" TypeName ] [ "=" Expression ] StatementTerminator
(. PushContext(Context.IdentifierExpected, la, t); .) IdentifierForFieldDeclaration (. PopContext(); .) [ (. PushContext(Context.Type, la, t); .) "As" TypeName (. PopContext(); .) ] [ "=" Expression ] StatementTerminator
.
ParameterList =
@ -405,7 +405,7 @@ ParameterList = @@ -405,7 +405,7 @@ ParameterList =
.
Parameter =
{ AttributeBlock } { ParameterModifier } (. PushContext(Context.IdentifierExpected, la, t); .) Identifier (. PopContext(); .) [ "As" TypeName ] [ "=" Expression ]
{ AttributeBlock } { ParameterModifier } (. PushContext(Context.IdentifierExpected, la, t); .) Identifier (. PopContext(); .) [ (. PushContext(Context.Type, la, t); .) "As" TypeName (. PopContext(); .) ] [ "=" Expression ]
.
StatementTerminatorAndBlock =
@ -482,7 +482,7 @@ SimpleExpression = @@ -482,7 +482,7 @@ SimpleExpression =
.
NewExpression =
"New"
(. PushContext(Context.ObjectCreation, la, t); .) "New"
(
TypeName
@ -509,6 +509,7 @@ NewExpression = @@ -509,6 +509,7 @@ NewExpression =
|
"With" ObjectInitializer
)
(. PopContext(); .)
.
ObjectInitializer =
@ -566,7 +567,7 @@ SubLambdaExpression = @@ -566,7 +567,7 @@ SubLambdaExpression =
FunctionLambdaExpression =
"Function" "(" [ ParameterList ] ")"
( GREEDY Expression | [ "As" TypeName ] StatementTerminatorAndBlock "End" "Function" )
( GREEDY Expression | [ (. PushContext(Context.Type, la, t); .) "As" TypeName (. PopContext(); .) ] StatementTerminatorAndBlock "End" "Function" )
.
QueryExpression
@ -653,7 +654,7 @@ ExpressionRangeVariable = @@ -653,7 +654,7 @@ ExpressionRangeVariable =
(
(. PushContext(Context.IdentifierExpected, la, t); .) Identifier (. PopContext(); .)
(
"As" TypeName "="
(. PushContext(Context.Type, la, t); .) "As" TypeName (. PopContext(); .) "="
| "="
| (.
currentState = endOfStatementTerminatorAndBlock; /* leave this block */
@ -670,7 +671,7 @@ ExpressionRangeVariable = @@ -670,7 +671,7 @@ ExpressionRangeVariable =
.
CollectionRangeVariable =
(. PushContext(Context.IdentifierExpected, la, t); .) Identifier (. PopContext(); .) [ "As" TypeName ] "In" Expression
(. PushContext(Context.IdentifierExpected, la, t); .) Identifier (. PopContext(); .) [ (. PushContext(Context.Type, la, t); .) "As" TypeName (. PopContext(); .) ] "In" Expression
.
/* semantic action will be inserted on all paths that possibly lead to XmlLiteral */
@ -938,7 +939,21 @@ Statement = @@ -938,7 +939,21 @@ Statement =
VariableDeclarationStatement =
( "Dim" | "Static" | "Const" )
(. PushContext(Context.IdentifierExpected, la, t); .)
Identifier (. PopContext(); .) [ "?" ] [ ( "(" { "," } ")" ) ] { "," (. PushContext(Context.IdentifierExpected, la, t); .) Identifier (. PopContext(); .) [ "?" ] [ ( "(" { "," } ")" ) ] } [ "As" [ "New" ] TypeName ] [ "=" Expression ]
Identifier (. PopContext(); .) [ "?" ] [ ( "(" { "," } ")" ) ]
{ ","
(. PushContext(Context.IdentifierExpected, la, t); .)
Identifier (. PopContext(); .) [ "?" ] [ ( "(" { "," } ")" ) ]
}
[ (. PushContext(Context.Type, la, t); .)
"As" TypeName
[ "New" (. PushContext(Context.ObjectCreation, la, t); .) ]
TypeName
(.
if (CurrentBlock.context == Context.ObjectCreation)
PopContext();
PopContext();
.) ]
[ "=" Expression ]
.
WithOrLockStatement =
@ -1027,7 +1042,7 @@ ForEachLoopStatement = @@ -1027,7 +1042,7 @@ ForEachLoopStatement =
.
ForLoopVariable =
(. PushContext(Context.IdentifierExpected, la, t); .) SimpleExpression (. PopContext(); .) [ "?" ] { ExpressionSuffix } [ "As" TypeName ]
(. PushContext(Context.IdentifierExpected, la, t); .) SimpleExpression (. PopContext(); .) [ "?" ] { ExpressionSuffix } [ (. PushContext(Context.Type, la, t); .) "As" TypeName (. PopContext(); .) ]
.
ErrorHandlingStatement =
@ -1044,7 +1059,7 @@ TryStatement = @@ -1044,7 +1059,7 @@ TryStatement =
StatementTerminatorAndBlock
{
"Catch"
[ (. PushContext(Context.IdentifierExpected, la, t); .) Identifier (. PopContext(); .) [ "As" TypeName ] ]
[ (. PushContext(Context.IdentifierExpected, la, t); .) Identifier (. PopContext(); .) [ (. PushContext(Context.Type, la, t); .) "As" TypeName (. PopContext(); .) ] ]
[ "When" Expression ]
StatementTerminatorAndBlock
}

2
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.cs

@ -32,7 +32,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -32,7 +32,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
void PushContext(Context context, Token la, Token t)
{
string indent = new string('\t', stack.Count);
Location l = la == null ? Location.Empty : la.Location;
Location l = la == null ? (t == null ? Location.Empty : t.EndLocation) : la.Location;
stack.Push(new Block() { context = context, lastExpressionStart = l });
Print(indent + "enter " + context);

1
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs

@ -389,6 +389,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -389,6 +389,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
prevToken = t;
}
ef.Advance();
Debug.Assert(t != null);
return t;
}

4424
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Parser.cs

File diff suppressed because it is too large Load Diff

12
src/Libraries/NRefactory/Test/Lexer/VBNet/LexerContextTests.cs

@ -83,6 +83,8 @@ End Class @@ -83,6 +83,8 @@ End Class
enter Member
enter IdentifierExpected
exit IdentifierExpected
enter Type
exit Type
enter Expression
enter Expression
enter Expression
@ -295,6 +297,8 @@ End Class @@ -295,6 +297,8 @@ End Class
enter Expression
exit Expression
exit IdentifierExpected
enter Type
exit Type
enter Expression
enter Expression
enter Expression
@ -311,6 +315,8 @@ End Class @@ -311,6 +315,8 @@ End Class
enter Expression
exit Expression
exit IdentifierExpected
enter Type
exit Type
enter Expression
enter Expression
enter Expression
@ -323,6 +329,8 @@ End Class @@ -323,6 +329,8 @@ End Class
exit Body
enter IdentifierExpected
exit IdentifierExpected
enter Type
exit Type
enter Body
exit Body
exit Body
@ -352,6 +360,8 @@ End Class", @@ -352,6 +360,8 @@ End Class",
enter Member
enter IdentifierExpected
exit IdentifierExpected
enter Type
exit Type
exit Member
enter Member
enter IdentifierExpected
@ -465,6 +475,7 @@ End Module", @@ -465,6 +475,7 @@ End Module",
exit Expression
enter Expression
enter Expression
enter ObjectCreation
enter Expression
enter Expression
enter Expression
@ -477,6 +488,7 @@ End Module", @@ -477,6 +488,7 @@ End Module",
exit Expression
exit Expression
exit Expression
exit ObjectCreation
exit Expression
exit Expression
exit Expression

28
src/Main/Base/Test/VBExpressionFinderTests.cs

@ -49,6 +49,14 @@ Class MainClass @@ -49,6 +49,14 @@ Class MainClass
End Class
";
const string program4 = @"
Class MainClass
Sub A
Dim a
End Sub
End Class
";
VBNetExpressionFinder ef;
[SetUp]
@ -83,7 +91,7 @@ End Class @@ -83,7 +91,7 @@ End Class
[Test]
public void FindSimple()
{
Find(program2, "sole", 0,"Con", ExpressionContext.Default);
Find(program2, "sole", 0,"Con", ExpressionContext.MethodBody);
}
[Test]
@ -107,7 +115,7 @@ End Class @@ -107,7 +115,7 @@ End Class
[Test]
public void ForEachLoop()
{
Find(program1, "loopVarName", 4, "loop", ExpressionContext.Default);
Find(program1, "loopVarName", 4, "loop", ExpressionContext.IdentifierExpected);
}
[Test]
@ -117,6 +125,22 @@ End Class @@ -117,6 +125,22 @@ End Class
}
#endregion
#region Context Tests
void ContextTest(string program, string location, int offset, ExpressionContext context)
{
int pos = program.IndexOf(location);
if (pos < 0) Assert.Fail("location not found in program");
ExpressionResult er = ef.FindExpression(program, pos + offset);
Assert.AreEqual(context.ToString(), er.Context.ToString());
}
[Test]
public void ContextAfterDimIdentifier()
{
ContextTest(program4, " a ", 3, ExpressionContext.MethodBody);
}
#endregion
#region FindFull
[Test]
public void Simple()

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

@ -1139,7 +1139,6 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -1139,7 +1139,6 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
List<ICompletionEntry> result = new List<ICompletionEntry>();
if (language == NR.SupportedLanguage.VBNet) {
if (context == ExpressionContext.MethodBody)
CtrlSpaceInternal(result, fileContent, showEntriesFromAllNamespaces);
} else {
if (context == ExpressionContext.TypeDeclaration) {

24
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/VBNet/VBNetExpressionFinder.cs

@ -59,18 +59,23 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet @@ -59,18 +59,23 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet
ExpressionFinder p = new ExpressionFinder();
lexer = ParserFactory.CreateLexer(SupportedLanguage.VBNet, new StringReader(text));
Token t;
Token t = lexer.NextToken();
do {
t = lexer.NextToken();
if (t.Location >= targetPosition)
break;
while (t.EndLocation < targetPosition) {
p.InformToken(t);
} while (t.EndLocation < targetPosition);
t = lexer.NextToken();
}
p.Advance();
var block = p.CurrentBlock;
ExpressionContext context = p.IsIdentifierExpected ? ExpressionContext.IdentifierExpected : GetContext(block);
if (t.Location < targetPosition) {
p.InformToken(t);
p.Advance();
}
BitArray expectedSet;
@ -81,11 +86,10 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet @@ -81,11 +86,10 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet
}
if (p.NextTokenIsPotentialStartOfExpression)
return new ExpressionResult("", DomRegion.Empty, GetContext(p.CurrentBlock), expectedSet);
return new ExpressionResult("", DomRegion.Empty, GetContext(block), expectedSet);
int lastExpressionStartOffset = LocationToOffset(block.lastExpressionStart);
ExpressionContext context = p.IsIdentifierExpected ? ExpressionContext.IdentifierExpected : GetContext(block);
if (lastExpressionStartOffset < 0)
return new ExpressionResult(null, DomRegion.Empty, context, expectedSet);
@ -130,10 +134,14 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet @@ -130,10 +134,14 @@ namespace ICSharpCode.SharpDevelop.Dom.VBNet
return ExpressionContext.IdentifierExpected;
case Context.TypeDeclaration:
return ExpressionContext.TypeDeclaration;
case Context.Type:
return ExpressionContext.Type;
case Context.Body:
return ExpressionContext.MethodBody;
case Context.Importable:
return ExpressionContext.Importable;
case Context.ObjectCreation:
return ExpressionContext.ObjectCreation;
}
return ExpressionContext.Default;

Loading…
Cancel
Save