Browse Source

- fixed missing Implements/Handles clause in Sub and Function declarations in EF Parser

- fixed bug in ILC handling
- added more informative exception message for errors in XML mode handling

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6365 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 15 years ago
parent
commit
f12702b989
  1. 487
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBIndentationStrategy.atg
  2. 48
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/OptionPanels/ProjectImportsOptions.xaml
  3. 41
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/OptionPanels/ProjectImportsOptions.xaml.cs
  4. 9
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/OptionPanels/TextEditorOptions.xaml
  5. 6
      src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj
  6. 6
      src/AddIns/Misc/ResourceToolkit/Test/VBNet/BclNRefactoryResourceResolverTests.cs
  7. 5
      src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexer.cs
  8. 5
      src/Libraries/NRefactory/Project/Src/Lexer/ILexer.cs
  9. 2
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Block.cs
  10. 12
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.atg
  11. 14
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs
  12. 5276
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Parser.cs
  13. 31
      src/Libraries/NRefactory/Test/Lexer/VBNet/XmlModeLexerTests.cs
  14. 4
      src/Libraries/NRefactory/Test/NRefactoryTests.csproj

487
src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBIndentationStrategy.atg

@ -20,7 +20,7 @@ TOKENS @@ -20,7 +20,7 @@ TOKENS
LiteralSingle
LiteralDecimal
LiteralDate
XmlOpenTag
XmlOpenTag
XmlCloseTag
XmlStartInlineVB
XmlEndInlineVB
@ -285,495 +285,14 @@ TypeDeclaration = @@ -285,495 +285,14 @@ TypeDeclaration =
InterfaceDeclaration
.
ClassOrModuleOrStructureTypeDeclaration =
( "Module" | "Class" | "Structure" ) ANY
[ "(" "Of" GenericTypeParameterDeclaration ")" ] StatementTerminator
(. Indent(la); .)
{
( ClassOrModuleOrStructureTypeDeclaration | DelegateTypeDeclaration | EnumTypeDeclaration
| InterfaceDeclaration | MemberDeclaration )
}
(. Unindent(la); .)
"End" ( "Module" | "Class" | "Structure" ) StatementTerminator
.
DelegateTypeDeclaration = "Delegate" { ANY } StatementTerminator .
EnumTypeDeclaration =
"Enum" { ANY } StatementTerminator
(. Indent(la); .)
{ ANY [ "=" Expression ] StatementTerminator }
{ ANY } StatementTerminator
(. Unindent(la); .)
"End" "Enum" StatementTerminator
.
InterfaceDeclaration =
"Interface" ANY [ "(" "Of" GenericTypeParameterDeclaration ")" ] StatementTerminator
(. Indent(la); .)
[ "Inherits" TypeName { "," TypeName } StatementTerminator ]
{
( ClassOrModuleOrStructureTypeDeclaration | DelegateTypeDeclaration | EnumTypeDeclaration
| InterfaceDeclaration | InterfaceMemberDeclaration ) { ANY }
}
(. Unindent(la); .)
"End" "Interface" StatementTerminator
.
InterfaceMemberDeclaration =
InterfaceEvent | InterfaceProperty | InterfaceSubOrFunction
.
InterfaceEvent =
"Event" { ANY } StatementTerminator
.
InterfaceProperty =
"Property" { ANY } StatementTerminator
.
InterfaceSubOrFunction =
("Sub" | "Function") { ANY }
{ "(" [ ( "Of" GenericTypeParameterDeclaration | ParameterList ) ] ")" }
[ "As" TypeName ]
StatementTerminator
.
GenericConstraint =
TypeName | "New" | "Class" | "Structure"
.
GenericConstraintList =
GenericConstraint | "{" GenericConstraint { "," GenericConstraint } "}"
.
GenericTypeParameterDeclaration =
[ "Out" | "In" ] ANY [ "As" GenericConstraintList ]
{ "," [ "Out" | "In" ] ANY [ "As" GenericConstraintList ] }
.
DelegateTypeDeclaration =
"Delegate" ("Sub" | "Function") ANY
[ "(" [ ParameterList ] ")" ] [ "As" TypeName ] StatementTerminator
.
MemberDeclaration =
(
MemberVariableOrConstantDeclaration |
SubOrFunctionDeclaration |
ExternalMemberDeclaration |
EventMemberDeclaration |
CustomEventMemberDeclaration |
PropertyDeclaration |
OperatorDeclaration
)
.
SubOrFunctionDeclaration =
("Sub" | "Function")
ANY
{ "(" [ ( "Of" GenericTypeParameterDeclaration | ParameterList ) ] ")" }
[ "As" TypeName ]
StatementTerminatorAndBlock
"End" ("Sub" | "Function") StatementTerminator
.
ExternalMemberDeclaration =
"Declare" [ "Ansi" | "Unicode" | "Auto" ] ( "Sub" | "Function" ) ANY
"Lib" LiteralString [ "Alias" LiteralString ] [ "(" [ ParameterList ] ")" ] [ "As" TypeName ] StatementTerminator
.
EventMemberDeclaration =
"Event" ANY ( "As" TypeName | [ "(" [ 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
.
CustomEventMemberDeclaration =
"Custom" EventMemberDeclaration
{
( "AddHandler" | "RemoveHandler" | "RaiseEvent" ) "(" ParameterList ")"
StatementTerminatorAndBlock
"End" ( "AddHandler" | "RemoveHandler" | "RaiseEvent" ) StatementTerminator
}
"End" "Event" StatementTerminator
.
PropertyDeclaration =
"Property" { ANY } [ "=" Expression ] StatementTerminator
{ ANY }
[ (. Indent(la); .)
( "Get" | "Set" ) [ "(" [ ParameterList ] ")" ]
StatementTerminatorAndBlock
"End" ( "Get" | "Set" ) StatementTerminator
[ ( "Get" | "Set" ) [ "(" [ ParameterList ] ")" ]
StatementTerminatorAndBlock
"End" ( "Get" | "Set" ) StatementTerminator ]
(. Unindent(la); .)
"End" "Property" StatementTerminator ]
.
OperatorDeclaration =
"Operator" { ANY }
StatementTerminatorAndBlock
"End" "Operator" StatementTerminator
.
MemberVariableOrConstantDeclaration =
MemberVariableOrConstantDeclarator { "," MemberVariableOrConstantDeclarator } StatementTerminator
.
MemberVariableOrConstantDeclarator =
[ "Const" ]
ANY
[ "As" ( NewExpression | TypeName ) ]
[ "=" Expression ]
.
ParameterList =
Parameter { "," Parameter }
.
Parameter =
ANY
{ ANY }
[ "As" TypeName ]
[ "=" Expression ]
.
StatementTerminatorAndBlock =
(. Indent(la); .)
StatementTerminator
{ EXPECTEDCONFLICT("End")
(
[ Statement] StatementTerminator
| "End"
( StatementTerminator /* End+StatementTerminator is end statement */
| /* End+anything else is the end of this block. */
(.
currentState = endOfStatementTerminatorAndBlock; /* leave this block */
InformToken(t); /* process End again*/
/* for processing current token (la): go to the position after processing End */
goto switchlbl;
.)
ANY /* never reached due to goto above: */
/* this ANY is just so that Coco knows this branch isn't empty */
)
)
}
(.NamedState:endOfStatementTerminatorAndBlock.)
(. Unindent(la); .)
.
Expression
(.NamedState:startOfExpression.)
= SimpleExpressionWithSuffix { BinaryOperator SimpleExpressionWithSuffix } .
BinaryOperator =
"+" | "-" | "*" | "\\" | "/" | "^" | "Mod"
| "=" | "<>" | "<" | ">" | "<=" | ">="
| "Like" | "&" | "And" | "AndAlso" | "Or" | "OrElse"
| "Xor" | "<<" | ">>" | "Is" | "IsNot"
| "^=" | "*=" | "/=" | "\\=" | "+=" | "-=" | "&=" | "<<=" | ">>=" | "To" | ":="
.
UnaryOperator =
"+" | "-" | "Not" | "AddressOf"
.
SimpleExpressionWithSuffix =
{ UnaryOperator }
(
SimpleExpression { ExpressionSuffix }
| "TypeOf" SimpleExpressionWithSuffix "Is" TypeName
| NewExpression
| CollectionInitializer
)
.
SimpleExpression =
( ANY
| XmlLiteral
| LambdaExpression
| ConditionalExpression
)
.
NewExpression =
"New" (
TypeName
[
EXPECTEDCONFLICT("From")
(
"From"
(
CollectionInitializer /* From + CollectionInitializer is a NewExpression */
|
(.
currentState = endOfStatementTerminatorAndBlock; /* leave this block */
InformToken(t); /* process From again*/
/* for processing current token (la): go to the position after processing End */
goto switchlbl;
.)
ANY /* never reached due to goto above: */
/* this ANY is just so that Coco knows this branch isn't empty */
)
|
"With" ObjectInitializer
)
]
|
"With" ObjectInitializer
)
.
ObjectInitializer =
"{" [ "Key" ] "." ANY "=" Expression { "," [ "Key" ] "." ANY "=" Expression } "}"
.
CollectionInitializer =
"{" Expression { "," Expression } "}"
.
ExpressionSuffix =
"(" ( "Of" TypeName { "," TypeName } ")" | [ ArgumentList ] ")" )
| ( "." | "!" | ".@" | "..." ) [ XmlOpenTag ] ANY [ XmlCloseTag ]
.
ConditionalExpression =
"If" "(" Expression "," Expression [ "," Expression ] ")"
.
LambdaExpression =
SubLambdaExpression |
FunctionLambdaExpression
.
SubLambdaExpression =
"Sub" "(" [ ParameterList ] ")"
( GREEDY Statement | StatementTerminatorAndBlock "End" "Sub" )
.
FunctionLambdaExpression =
"Function" "(" [ ParameterList ] ")"
( GREEDY Expression | [ "As" TypeName ] StatementTerminatorAndBlock "End" "Function" )
.
/* semantic action will be inserted on all paths that possibly lead to XmlLiteral */
XmlLiteral =
(
( XmlComment | XmlProcessingInstruction | XmlCData ) [ XmlContent ] { ( XmlComment | XmlProcessingInstruction ) [ XmlContent ] } [ XmlElement { XmlComment [ XmlContent ] } ]
|
XmlElement { XmlComment [ XmlContent ] }
)
.
XmlElement =
XmlOpenTag { ANY | XmlEmbeddedExpression } ( XmlCloseTagEmptyElement | XmlCloseTag { ANY | XmlEmbeddedExpression | XmlElement } XmlOpenEndTag { ANY | XmlEmbeddedExpression } XmlCloseTag )
.
XmlEmbeddedExpression =
XmlStartInlineVB Expression XmlEndInlineVB
.
PrimitiveTypeName =
"Byte" |
"SByte" |
"UShort" |
"Short" |
"UInteger" |
"Integer" |
"ULong" |
"Long" |
"Single" |
"Double" |
"Decimal" |
"Boolean" |
"Date" |
"Char" |
"String" |
"Object"
.
TypeName = ( "Global" | ident | PrimitiveTypeName | "?" /* used for ? = completion */ ) { TypeSuffix } { "." IdentifierOrKeyword { TypeSuffix } } .
TypeSuffix = "(" ( "Of" [ TypeName ] { "," [ TypeName ] } | [ ArgumentList ] ) ")" .
IdentifierOrKeyword = ANY .
Statement =
VariableDeclarationStatement
| WithOrLockStatement
| AddOrRemoveHandlerStatement
| RaiseEventStatement
| EXPECTEDCONFLICT("If") IfStatement /* prefer if-statement to if-expression */
| SelectStatement
| WhileStatement
| DoLoopStatement
| ForStatement
| ErrorHandlingStatement
| ThrowStatement
| TryStatement
| BranchStatement
| ReDimStatement
| EraseStatement
| UsingStatement
| InvocationStatement
.
VariableDeclarationStatement =
( "Dim" | "Static" | "Const" ) ANY [ "?" ] [ ( "(" { "," } ")" ) ]
{ "," ANY [ "?" ] [ ( "(" { "," } ")" ) ] }
[ "As" ( NewExpression | TypeName ) ]
[ "=" Expression ]
.
WithOrLockStatement =
( "With" | "SyncLock" ) Expression StatementTerminatorAndBlock "End" ( "With" | "SyncLock" )
.
AddOrRemoveHandlerStatement =
( "AddHandler" | "RemoveHandler" ) Expression "," Expression
.
RaiseEventStatement =
"RaiseEvent" IdentifierOrKeyword [ "(" [ ArgumentList ] ")" ]
.
IfStatement =
"If" Expression
( "Then"
( Statement { EXPECTEDCONFLICT(":") ":" [Statement] } [ EXPECTEDCONFLICT("Else") "Else" [Statement] { EXPECTEDCONFLICT(":") ":" [Statement] } ]
| MultilineIfRemainder
)
| MultilineIfRemainder
)
.
MultilineIfRemainder =
StatementTerminatorAndBlock
{
("Else" [ "If" Expression [ "Then" ] ]
| "ElseIf" Expression [ "Then" ]
)
StatementTerminatorAndBlock
}
"End" "If"
.
SelectStatement =
"Select" [ "Case" ] Expression StatementTerminator
{
"Case" (
"Else" |
( [ "Is" ] ComparisonOperator SimpleExpressionWithSuffix | Expression )
{ "," ( [ "Is" ] ComparisonOperator SimpleExpressionWithSuffix | Expression ) }
)
StatementTerminatorAndBlock
}
"End" "Select"
.
ComparisonOperator =
"=" | "<>" | "<" | ">" | ">=" | "<="
.
WhileStatement =
"While" Expression StatementTerminatorAndBlock "End" "While"
.
DoLoopStatement =
"Do" ( DoTopLoopStatement | DoBottomLoopStatement )
.
DoTopLoopStatement =
( "While" | "Until" ) Expression
StatementTerminatorAndBlock
"Loop"
.
DoBottomLoopStatement =
StatementTerminatorAndBlock
"Loop" [ ( "While" | "Until" ) Expression ]
.
ForStatement =
"For" ( ForLoopStatement | ForEachLoopStatement )
.
ForLoopStatement =
ForLoopVariable "=" Expression /* "To" is binary operator */ [ "Step" Expression ]
StatementTerminatorAndBlock
"Next" [ Expression { "," Expression } ]
.
ForEachLoopStatement =
"Each" ForLoopVariable "In" Expression
StatementTerminatorAndBlock
"Next" [ Expression { "," Expression } ]
.
ForLoopVariable =
SimpleExpression
[ "?" ] { ExpressionSuffix }
[ "As" TypeName ]
.
ErrorHandlingStatement =
[ "On" ] "Error" ( Expression | "GoTo" ( LiteralInteger | ident ) | "Resume" "Next" )
| "Resume" ( "Next" | LiteralInteger | ident )
.
ThrowStatement =
"Throw" [ Expression ]
.
TryStatement =
"Try"
StatementTerminatorAndBlock
{
"Catch"
[ ANY [ "As" TypeName ] ]
[ "When" Expression ]
StatementTerminatorAndBlock
}
[
"Finally"
StatementTerminatorAndBlock
]
"End" "Try"
.
BranchStatement =
"GoTo" ( ident | LiteralInteger )
| "Exit" ( "Do" | "For" | "While" | "Select" | "Sub" | "Function" | "Property" | "Try" )
| "Continue" ( "Do" | "For" | "While" )
| "Stop"
/*| "End" HACK End-Statements has special handling in Block */
| "Return" [ Expression ]
.
ReDimStatement =
"ReDim"
[ EXPECTEDCONFLICT("Preserve") "Preserve" ] /* Preserve is context-dependend keyword */
Expression
.
EraseStatement =
"Erase" Expression { "," Expression }
.
UsingStatement =
"Using" Expression
StatementTerminatorAndBlock
"End" "Using"
.
InvocationStatement =
[ "Call" ] Expression
.
ArgumentList =
Expression { "," [ Expression ] }
| "," [ Expression ] { "," [ Expression ] }
.
END VBIndentationStrategy.

48
src/AddIns/BackendBindings/VBNetBinding/Project/Src/OptionPanels/ProjectImportsOptions.xaml

@ -0,0 +1,48 @@ @@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<gui:OptionPanel
x:Class="ICSharpCode.VBNetBinding.OptionPanels.ProjectImportsOptions" xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui;assembly=ICSharpCode.SharpDevelop" xmlns:addin="clr-namespace:ICSharpCode.VBNetBinding.OptionPanels" xmlns:sd="http://icsharpcode.net/sharpdevelop/core" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:widgets="http://icsharpcode.net/sharpdevelop/widgets">
<GroupBox
Header="${res:Dialog.ProjectOptions.ProjectImports.Title}"
Grid.Column="0"
Grid.Row="0"
HorizontalAlignment="Left"
VerticalAlignment="Top">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition
Width="*" />
<ColumnDefinition
Width="Auto" />
</Grid.ColumnDefinitions>
<ListBox
Grid.Column="0"
Grid.Row="0"
Margin="3,3,3,3"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" />
<widgets:StackPanelWithSpacing
SpaceBetweenItems="5"
Grid.Column="1"
Grid.Row="0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Margin="3,3,3,3">
<Label
Content="${res:Dialog.ProjectOptions.ProjectImports.Title}" />
<ComboBox
Height="20"
Name="namespaces" />
<widgets:UniformGridWithSpacing>
<Button
Content="${res:Dialog.ProjectOptions.ProjectImports.AddImport}"
Name="addImport"
Click="AddImportClick" />
<Button
Content="${res:Dialog.ProjectOptions.ProjectImports.RemoveImport}"
Name="removeImport"
Click="RemoveImportClick" />
</widgets:UniformGridWithSpacing>
</widgets:StackPanelWithSpacing>
</Grid>
</GroupBox>
</gui:OptionPanel>

41
src/AddIns/BackendBindings/VBNetBinding/Project/Src/OptionPanels/ProjectImportsOptions.xaml.cs

@ -0,0 +1,41 @@ @@ -0,0 +1,41 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Siegfried Pammer" email="siegfriedpammer@gmail.com" />
// <version>$Revision$</version>
// </file>
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.VBNetBinding.OptionPanels
{
/// <summary>
/// Interaction logic for ProjectImportsOptions.xaml
/// </summary>
public partial class ProjectImportsOptions : OptionPanel
{
public ProjectImportsOptions()
{
InitializeComponent();
}
void AddImportClick(object sender, RoutedEventArgs e)
{
}
void RemoveImportClick(object sender, RoutedEventArgs e)
{
}
}
}

9
src/AddIns/BackendBindings/VBNetBinding/Project/Src/OptionPanels/TextEditorOptions.xaml

@ -1,5 +1,10 @@ @@ -1,5 +1,10 @@
<gui:OptionPanel xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui;assembly=ICSharpCode.SharpDevelop"
x:Class="ICSharpCode.VBNetBinding.OptionPanels.TextEditorOptions" xmlns:addin="clr-namespace:ICSharpCode.VBNetBinding.OptionPanels" xmlns:sd="http://icsharpcode.net/sharpdevelop/core" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:widgets="http://icsharpcode.net/sharpdevelop/widgets">
<gui:OptionPanel x:Class="ICSharpCode.VBNetBinding.OptionPanels.TextEditorOptions"
xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui;assembly=ICSharpCode.SharpDevelop"
xmlns:addin="clr-namespace:ICSharpCode.VBNetBinding.OptionPanels"
xmlns:sd="http://icsharpcode.net/sharpdevelop/core"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:widgets="http://icsharpcode.net/sharpdevelop/widgets">
<StackPanel>
<GroupBox
Header="{sd:Localize Dialog.Options.IDEOptions.TextEditor.VB.FormattingGroupBox}"

6
src/AddIns/BackendBindings/VBNetBinding/Project/VBNetBinding.csproj

@ -66,6 +66,10 @@ @@ -66,6 +66,10 @@
</Compile>
<Compile Include="Src\FormattingStrategy\VBIndentationStrategy.cs" />
<Compile Include="Src\FormattingStrategy\VBStatement.cs" />
<Compile Include="Src\OptionPanels\ProjectImportsOptions.xaml.cs">
<DependentUpon>ProjectImportsOptions.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\OptionPanels\TextEditorOptions.xaml.cs">
<DependentUpon>TextEditorOptions.xaml</DependentUpon>
<SubType>Code</SubType>
@ -86,6 +90,7 @@ @@ -86,6 +90,7 @@
</None>
<None Include="Src\FormattingStrategy\VBIndentationStrategy.atg">
<Generator>CocoParserGenerator</Generator>
<CustomToolNamespace>ICSharpCode.VBNetBinding</CustomToolNamespace>
</None>
<None Include="VBNetBinding.addin">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
@ -135,6 +140,7 @@ @@ -135,6 +140,7 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Page Include="Src\OptionPanels\ProjectImportsOptions.xaml" />
<Page Include="Src\OptionPanels\TextEditorOptions.xaml" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />

6
src/AddIns/Misc/ResourceToolkit/Test/VBNet/BclNRefactoryResourceResolverTests.cs

@ -16,7 +16,6 @@ using NUnit.Framework; @@ -16,7 +16,6 @@ using NUnit.Framework;
namespace ResourceToolkit.Tests.VBNet
{
[TestFixture]
[Ignore("VB ExpressionFinder is broken")]
public sealed class BclNRefactoryResourceResolverTests : AbstractVBNetResourceResolverTestFixture
{
// ********************************************************************************************************************************
@ -34,6 +33,7 @@ End Class @@ -34,6 +33,7 @@ End Class
";
[Test]
[Ignore]
public void LocalSRMDirectInitFullNameGetString()
{
ResourceResolveResult rrr = Resolve(CodeLocalSRMDirectInitFullName, 3, 18, null);
@ -62,6 +62,7 @@ End Class @@ -62,6 +62,7 @@ End Class
";
[Test]
[Ignore]
public void LocalSRMDeferredInitUsingGetString()
{
ResourceResolveResult rrr = Resolve(CodeLocalSRMDeferredInitUsing, 6, 18, null);
@ -69,6 +70,7 @@ End Class @@ -69,6 +70,7 @@ End Class
}
[Test]
[Ignore]
public void LocalSRMDeferredInitUsingGetStringCompletion()
{
ResourceResolveResult rrr = Resolve(CodeLocalSRMDeferredInitUsing, 7, 16, '(');
@ -95,6 +97,7 @@ End Class @@ -95,6 +97,7 @@ End Class
";
[Test]
[Ignore]
public void StaticPropertySRMFieldDirectInitUsingClassGetString()
{
ResourceResolveResult rrr = Resolve(CodeStaticPropertySRMFieldDirectInitUsing, 11, 25, null);
@ -102,6 +105,7 @@ End Class @@ -102,6 +105,7 @@ End Class
}
[Test]
[Ignore]
public void StaticPropertySRMFieldDirectInitUsingGetString()
{
ResourceResolveResult rrr = Resolve(CodeStaticPropertySRMFieldDirectInitUsing, 12, 23, null);

5
src/Libraries/NRefactory/Project/Src/Lexer/AbstractLexer.cs

@ -381,5 +381,10 @@ namespace ICSharpCode.NRefactory.Parser @@ -381,5 +381,10 @@ namespace ICSharpCode.NRefactory.Parser
{
throw new NotSupportedException();
}
public virtual void SetInitialContext(SnippetType context)
{
throw new NotSupportedException();
}
}
}

5
src/Libraries/NRefactory/Project/Src/Lexer/ILexer.cs

@ -20,6 +20,11 @@ namespace ICSharpCode.NRefactory.Parser @@ -20,6 +20,11 @@ namespace ICSharpCode.NRefactory.Parser
/// </summary>
void SetInitialLocation(Location location);
/// <summary>
/// Sets the context of the lexer.
/// </summary>
void SetInitialContext(SnippetType context);
Errors Errors {
get;
}

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

@ -17,6 +17,8 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -17,6 +17,8 @@ namespace ICSharpCode.NRefactory.Parser.VB
Global,
TypeDeclaration,
ObjectCreation,
ObjectInitializer,
CollectionInitializer,
Type,
Member,
Parameter,

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

@ -424,6 +424,7 @@ SubOrFunctionDeclaration = @@ -424,6 +424,7 @@ SubOrFunctionDeclaration =
("Sub" | "Function")
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) ANY (. PopContext(); .)
{ "(" [ ( "Of" GenericTypeParameterDeclaration | ParameterList ) ] ")" }
[ ( "Implements" | "Handles" ) [ ( "Me" | "MyClass" | "MyBase" ) "." ] TypeName ]
[ "As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) ]
StatementTerminatorAndBlock
"End" ("Sub" | "Function") StatementTerminator
@ -597,6 +598,7 @@ NewExpression = @@ -597,6 +598,7 @@ NewExpression =
[
EXPECTEDCONFLICT("From")
(
(. PushContext(Context.CollectionInitializer, la, t); .)
"From"
(
CollectionInitializer /* From + CollectionInitializer is a NewExpression */
@ -610,12 +612,17 @@ NewExpression = @@ -610,12 +612,17 @@ NewExpression =
ANY /* never reached due to goto above: */
/* this ANY is just so that Coco knows this branch isn't empty */
)
(. PopContext(); .)
|
(. PushContext(Context.ObjectInitializer, la, t); .)
"With" ObjectInitializer
(. PopContext(); .)
)
]
|
(. PushContext(Context.ObjectInitializer, la, t); .)
"With" ObjectInitializer
(. PopContext(); .)
)
(. PopContext(); .)
.
@ -764,7 +771,8 @@ ExpressionRangeVariable = @@ -764,7 +771,8 @@ ExpressionRangeVariable =
"Binary", "Auto", "Assembly", "Ascending", "Ansi", "Aggregate", ident)
(
(. PushContext(Context.Identifier, la, t); .) (.OnEachPossiblePath: SetIdentifierExpected(la); .) Identifier (. PopContext(); .)
(
// HACK: needs to be optional because Expression can start with Identifier too
[
"As" (. PushContext(Context.Type, la, t); .) TypeName (. PopContext(); .) "="
| "="
| (.
@ -775,7 +783,7 @@ ExpressionRangeVariable = @@ -775,7 +783,7 @@ ExpressionRangeVariable =
.)
ANY /* never reached due to goto above: */
/* this ANY is just so that Coco knows this branch isn't empty */
)
]
)
]
Expression

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

@ -64,6 +64,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -64,6 +64,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
return new Token(Tokens.EOF, Col, Line, string.Empty);
char ch = (char)nextChar;
#region XML mode
CheckXMLState(startLocation);
if (inXmlMode && xmlModeStack.Peek().level <= 0 && !xmlModeStack.Peek().isDocumentStart && !xmlModeStack.Peek().inXmlTag) {
XmlModeInfo info = xmlModeStack.Peek();
int peek = nextChar;
@ -195,7 +196,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -195,7 +196,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
}
}
if (!lineEnd) {
errors.Error(Line, Col, String.Format("Return expected"));
errors.Error(Line, Col, String.Format("NewLine expected"));
}
lineEnd = oldLineEnd;
continue;
@ -363,6 +364,12 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -363,6 +364,12 @@ namespace ICSharpCode.NRefactory.Parser.VB
}
}
}
void CheckXMLState(Location startLocation)
{
if (inXmlMode && !xmlModeStack.Any())
throw new InvalidOperationException("invalid XML stack state at " + startLocation);
}
Token prevToken;
@ -376,7 +383,8 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -376,7 +383,8 @@ namespace ICSharpCode.NRefactory.Parser.VB
if (SkipEOL(prevToken.kind, t.next.kind)) {
t = t.next;
}
}
} else
encounteredLineContinuation = false;
// inform EF only once we're sure it's really a token
// this means we inform it about EOL tokens "1 token too late", but that's not a problem because
// XML literals cannot start immediately after an EOL token
@ -1134,7 +1142,7 @@ namespace ICSharpCode.NRefactory.Parser.VB @@ -1134,7 +1142,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
}
}
public void SetInitialContext(SnippetType type)
public override void SetInitialContext(SnippetType type)
{
ef.SetContext(type);
}

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

File diff suppressed because it is too large Load Diff

31
src/Libraries/NRefactory/Test/Lexer/VBNet/XmlModeLexerTests.cs

@ -902,6 +902,27 @@ End Using"; @@ -902,6 +902,27 @@ End Using";
CheckFoot(lexer);
}
[Test]
public void NewExpressionWithObjectInitializer()
{
string code = @"New Common.ComboBoxItem With {.Item = _
Localizer.GetString(""Month"" & initParameters.SelectedDate.FirstDayOfPreviousMonth.Month) & "" "" &
initParameters.SelectedDate.FirstDayOfPreviousMonth.Year, .Value = New Date(2010, initParameters.SelectedDate.FirstDayOfPreviousMonth.Month, 1)}";
ILexer lexer = GenerateLexerForSnippet(new StringReader(code), SnippetType.Expression);
CheckTokens(lexer, Tokens.New, Tokens.Identifier, Tokens.Dot, Tokens.Identifier,
Tokens.With, Tokens.OpenCurlyBrace, Tokens.Dot, Tokens.Identifier, Tokens.Assign,
Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.OpenParenthesis, Tokens.LiteralString,
Tokens.ConcatString, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.Dot,
Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.CloseParenthesis, Tokens.ConcatString,
Tokens.LiteralString, Tokens.ConcatString, Tokens.Identifier, Tokens.Dot, Tokens.Identifier,
Tokens.Dot, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.Comma, Tokens.Dot,
Tokens.Identifier, Tokens.Assign, Tokens.New, Tokens.Date, Tokens.OpenParenthesis, Tokens.LiteralInteger,
Tokens.Comma, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.Dot,
Tokens.Identifier, Tokens.Comma, Tokens.LiteralInteger, Tokens.CloseParenthesis, Tokens.CloseCurlyBrace);
}
#endregion
#region Helpers
@ -910,6 +931,13 @@ End Using"; @@ -910,6 +931,13 @@ End Using";
return ParserFactory.CreateLexer(SupportedLanguage.VBNet, sr);
}
ILexer GenerateLexerForSnippet(StringReader sr, SnippetType type)
{
var lexer = ParserFactory.CreateLexer(SupportedLanguage.VBNet, sr);
lexer.SetInitialContext(type);
return lexer;
}
string TestStatement(string stmt)
{
return "Class Test\n" +
@ -936,7 +964,8 @@ End Using"; @@ -936,7 +964,8 @@ End Using";
int token = tokens[i];
Token t = lexer.NextToken();
int next = t.Kind;
Assert.AreEqual(token, next, "{2} of {3}: {0} != {1}; at {4}", Tokens.GetTokenString(token), Tokens.GetTokenString(next), i + 1, tokens.Length, t.Location);
Assert.IsEmpty(lexer.Errors.ErrorOutput);
Assert.AreEqual(token, next, "{2} of {3}: expected: \"{0}\", was: \"{1}\"; at {4}", Tokens.GetTokenString(token), Tokens.GetTokenString(next), i + 1, tokens.Length, t.Location);
}
}
#endregion

4
src/Libraries/NRefactory/Test/NRefactoryTests.csproj

@ -155,9 +155,7 @@ @@ -155,9 +155,7 @@
<Compile Include="Output\CodeDOM\CodeDOMParenthesizedExpressionTest.cs" />
<Compile Include="Parser\Statements\YieldStatementTests.cs" />
<Compile Include="Lexer\CSharp\NumberLexerTest.cs" />
<Compile Include="Lexer\VBNet\LiteralsTests.cs">
<DependentUpon>LexerTests.cs</DependentUpon>
</Compile>
<Compile Include="Lexer\VBNet\LiteralsTests.cs" />
<Compile Include="Parser\SkipMethodBodiesTest.cs" />
<Compile Include="Parser\Expressions\AnonymousMethodTests.cs" />
<Compile Include="Output\CodeDOM\InvocationExpressionTest.cs" />

Loading…
Cancel
Save