Browse Source

C# parser bug: fixed arrays in unsafe structs are now parsed correctly

XmlDoc.Load now does not throw an exception for invalid XML files.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1703 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
bbb73b9b8f
  1. 8
      src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs
  2. 4
      src/Libraries/NRefactory/NRefactoryASTGenerator/AST/GlobalLevel.cs
  3. 10
      src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Node.cs
  4. 2
      src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Statements.cs
  5. 33
      src/Libraries/NRefactory/NRefactoryASTGenerator/AST/TypeLevel.cs
  6. 6
      src/Libraries/NRefactory/Project/Src/Ast/Enums.cs
  7. 20
      src/Libraries/NRefactory/Project/Src/Ast/Generated.cs
  8. 2
      src/Libraries/NRefactory/Project/Src/IAstVisitor.cs
  9. 7
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs
  10. 1738
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
  11. 29
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
  12. 8
      src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs
  13. 6
      src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs
  14. 6
      src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs
  15. 18
      src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs
  16. 1
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/ModifierEnum.cs
  17. 7
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryASTConvertVisitor.cs
  18. 27
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/XmlDoc.cs

8
src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Expressions.cs

@ -16,19 +16,19 @@ namespace NRefactoryASTGenerator.Ast
[CustomImplementation] [CustomImplementation]
class PrimitiveExpression : Expression {} class PrimitiveExpression : Expression {}
enum ParamModifier { In } enum ParameterModifiers { In }
class ParameterDeclarationExpression : Expression { class ParameterDeclarationExpression : Expression {
List<AttributeSection> attributes; List<AttributeSection> attributes;
[QuestionMarkDefault] [QuestionMarkDefault]
string parameterName; string parameterName;
TypeReference typeReference; TypeReference typeReference;
ParamModifier paramModifier; ParameterModifiers paramModifier;
Expression defaultValue; Expression defaultValue;
public ParameterDeclarationExpression(TypeReference typeReference, string parameterName) {} public ParameterDeclarationExpression(TypeReference typeReference, string parameterName) {}
public ParameterDeclarationExpression(TypeReference typeReference, string parameterName, ParamModifier paramModifier) {} public ParameterDeclarationExpression(TypeReference typeReference, string parameterName, ParameterModifiers paramModifier) {}
public ParameterDeclarationExpression(TypeReference typeReference, string parameterName, ParamModifier paramModifier, Expression defaultValue) {} public ParameterDeclarationExpression(TypeReference typeReference, string parameterName, ParameterModifiers paramModifier, Expression defaultValue) {}
} }
class NamedArgumentExpression : Expression { class NamedArgumentExpression : Expression {

4
src/Libraries/NRefactory/NRefactoryASTGenerator/AST/GlobalLevel.cs

@ -38,7 +38,7 @@ namespace NRefactoryASTGenerator.Ast
List<ParameterDeclarationExpression> parameters; List<ParameterDeclarationExpression> parameters;
List<TemplateDefinition> templates; List<TemplateDefinition> templates;
public DelegateDeclaration(Modifier modifier, List<AttributeSection> attributes) : base(modifier, attributes) {} public DelegateDeclaration(Modifiers modifier, List<AttributeSection> attributes) : base(modifier, attributes) {}
} }
enum ClassType { Class } enum ClassType { Class }
@ -57,7 +57,7 @@ namespace NRefactoryASTGenerator.Ast
List<TemplateDefinition> templates; List<TemplateDefinition> templates;
Location bodyStartLocation; Location bodyStartLocation;
public TypeDeclaration(Modifier modifier, List<AttributeSection> attributes) : base(modifier, attributes) {} public TypeDeclaration(Modifiers modifier, List<AttributeSection> attributes) : base(modifier, attributes) {}
} }
[IncludeBoolProperty("IsAlias", "return !alias.IsNull;")] [IncludeBoolProperty("IsAlias", "return !alias.IsNull;")]

10
src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Node.cs

@ -14,7 +14,7 @@ namespace NRefactoryASTGenerator.Ast
interface INullable {} interface INullable {}
struct Location {} struct Location {}
enum Modifier { None } enum Modifiers { None }
[CustomImplementation] [CustomImplementation]
abstract class AbstractNode : INode {} abstract class AbstractNode : INode {}
@ -22,10 +22,10 @@ namespace NRefactoryASTGenerator.Ast
abstract class AttributedNode : AbstractNode abstract class AttributedNode : AbstractNode
{ {
List<AttributeSection> attributes; List<AttributeSection> attributes;
Modifier modifier; Modifiers modifier;
public AttributedNode(List<AttributeSection> attributes) {} public AttributedNode(List<AttributeSection> attributes) {}
public AttributedNode(Modifier modifier, List<AttributeSection> attributes) {} public AttributedNode(Modifiers modifier, List<AttributeSection> attributes) {}
} }
abstract class ParametrizedNode : AttributedNode abstract class ParametrizedNode : AttributedNode
@ -33,12 +33,12 @@ namespace NRefactoryASTGenerator.Ast
string name; string name;
List<ParameterDeclarationExpression> parameters; List<ParameterDeclarationExpression> parameters;
public ParametrizedNode(Modifier modifier, List<AttributeSection> attributes, public ParametrizedNode(Modifiers modifier, List<AttributeSection> attributes,
string name, List<ParameterDeclarationExpression> parameters) string name, List<ParameterDeclarationExpression> parameters)
: base(modifier, attributes) : base(modifier, attributes)
{} {}
public ParametrizedNode(Modifier modifier, List<AttributeSection> attributes) public ParametrizedNode(Modifiers modifier, List<AttributeSection> attributes)
: base(modifier, attributes) : base(modifier, attributes)
{} {}
} }

2
src/Libraries/NRefactory/NRefactoryASTGenerator/AST/Statements.cs

@ -104,7 +104,7 @@ namespace NRefactoryASTGenerator.Ast
[CustomImplementation] [CustomImplementation]
class LocalVariableDeclaration : Statement { class LocalVariableDeclaration : Statement {
TypeReference typeReference; TypeReference typeReference;
Modifier modifier; Modifiers modifier;
List<VariableDeclaration> variables; List<VariableDeclaration> variables;
} }

33
src/Libraries/NRefactory/NRefactoryASTGenerator/AST/TypeLevel.cs

@ -15,6 +15,7 @@ namespace NRefactoryASTGenerator.Ast
string name; string name;
Expression initializer; Expression initializer;
TypeReference typeReference; TypeReference typeReference;
Expression fixedArrayInitialization;
public VariableDeclaration(string name) {} public VariableDeclaration(string name) {}
public VariableDeclaration(string name, Expression initializer) {} public VariableDeclaration(string name, Expression initializer) {}
@ -26,13 +27,13 @@ namespace NRefactoryASTGenerator.Ast
ConstructorInitializer constructorInitializer; ConstructorInitializer constructorInitializer;
BlockStatement body; BlockStatement body;
public ConstructorDeclaration(string name, Modifier modifier, public ConstructorDeclaration(string name, Modifiers modifier,
List<ParameterDeclarationExpression> parameters, List<ParameterDeclarationExpression> parameters,
List<AttributeSection> attributes) List<AttributeSection> attributes)
: base(modifier, attributes, name, parameters) : base(modifier, attributes, name, parameters)
{} {}
public ConstructorDeclaration(string name, Modifier modifier, public ConstructorDeclaration(string name, Modifiers modifier,
List<ParameterDeclarationExpression> parameters, List<ParameterDeclarationExpression> parameters,
ConstructorInitializer constructorInitializer, ConstructorInitializer constructorInitializer,
List<AttributeSection> attributes) List<AttributeSection> attributes)
@ -98,12 +99,12 @@ namespace NRefactoryASTGenerator.Ast
Location bodyStart; Location bodyStart;
Location bodyEnd; Location bodyEnd;
public EventDeclaration(TypeReference typeReference, string name, Modifier modifier, List<AttributeSection> attributes, List<ParameterDeclarationExpression> parameters) public EventDeclaration(TypeReference typeReference, string name, Modifiers modifier, List<AttributeSection> attributes, List<ParameterDeclarationExpression> parameters)
: base(modifier, attributes, name, parameters) : base(modifier, attributes, name, parameters)
{ } { }
// for VB: // for VB:
public EventDeclaration(TypeReference typeReference, Modifier modifier, List<ParameterDeclarationExpression> parameters, List<AttributeSection> attributes, string name, List<InterfaceImplementation> interfaceImplementations) public EventDeclaration(TypeReference typeReference, Modifiers modifier, List<ParameterDeclarationExpression> parameters, List<AttributeSection> attributes, string name, List<InterfaceImplementation> interfaceImplementations)
: base(modifier, attributes, name, parameters) : base(modifier, attributes, name, parameters)
{ } { }
} }
@ -135,7 +136,7 @@ namespace NRefactoryASTGenerator.Ast
public FieldDeclaration(List<AttributeSection> attributes) : base(attributes) {} public FieldDeclaration(List<AttributeSection> attributes) : base(attributes) {}
// for all other cases // for all other cases
public FieldDeclaration(List<AttributeSection> attributes, TypeReference typeReference, Modifier modifier) public FieldDeclaration(List<AttributeSection> attributes, TypeReference typeReference, Modifiers modifier)
: base(modifier, attributes) : base(modifier, attributes)
{} {}
} }
@ -148,7 +149,7 @@ namespace NRefactoryASTGenerator.Ast
List<InterfaceImplementation> interfaceImplementations; List<InterfaceImplementation> interfaceImplementations;
List<TemplateDefinition> templates; List<TemplateDefinition> templates;
public MethodDeclaration(string name, Modifier modifier, TypeReference typeReference, List<ParameterDeclarationExpression> parameters, List<AttributeSection> attributes) : base(modifier, attributes, name, parameters) {} public MethodDeclaration(string name, Modifiers modifier, TypeReference typeReference, List<ParameterDeclarationExpression> parameters, List<AttributeSection> attributes) : base(modifier, attributes, name, parameters) {}
} }
enum ConversionType { None } enum ConversionType { None }
@ -162,7 +163,7 @@ namespace NRefactoryASTGenerator.Ast
List<AttributeSection> returnTypeAttributes; List<AttributeSection> returnTypeAttributes;
OverloadableOperatorType overloadableOperator; OverloadableOperatorType overloadableOperator;
public OperatorDeclaration(Modifier modifier, public OperatorDeclaration(Modifiers modifier,
List<AttributeSection> attributes, List<AttributeSection> attributes,
List<ParameterDeclarationExpression> parameters, List<ParameterDeclarationExpression> parameters,
TypeReference typeReference, TypeReference typeReference,
@ -170,7 +171,7 @@ namespace NRefactoryASTGenerator.Ast
: base(null, modifier, typeReference, parameters, attributes) : base(null, modifier, typeReference, parameters, attributes)
{} {}
public OperatorDeclaration(Modifier modifier, public OperatorDeclaration(Modifiers modifier,
List<AttributeSection> attributes, List<AttributeSection> attributes,
List<ParameterDeclarationExpression> parameters, List<ParameterDeclarationExpression> parameters,
TypeReference typeReference, TypeReference typeReference,
@ -184,13 +185,13 @@ namespace NRefactoryASTGenerator.Ast
[IncludeBoolProperty("IsReadOnly", "return HasGetRegion && !HasSetRegion;")] [IncludeBoolProperty("IsReadOnly", "return HasGetRegion && !HasSetRegion;")]
[IncludeBoolProperty("IsWriteOnly", "return !HasGetRegion && HasSetRegion;")] [IncludeBoolProperty("IsWriteOnly", "return !HasGetRegion && HasSetRegion;")]
[IncludeMember(@" [IncludeMember(@"
public PropertyDeclaration(string name, TypeReference typeReference, Modifier modifier, List<AttributeSection> attributes) : this(modifier, attributes, name, null) public PropertyDeclaration(string name, TypeReference typeReference, Modifiers modifier, List<AttributeSection> attributes) : this(modifier, attributes, name, null)
{ {
this.TypeReference = typeReference; this.TypeReference = typeReference;
if ((modifier & Modifier.ReadOnly) != Modifier.ReadOnly) { if ((modifier & Modifiers.ReadOnly) != Modifiers.ReadOnly) {
this.SetRegion = new PropertySetRegion(null, null); this.SetRegion = new PropertySetRegion(null, null);
} }
if ((modifier & Modifier.WriteOnly) != Modifier.WriteOnly) { if ((modifier & Modifiers.WriteOnly) != Modifiers.WriteOnly) {
this.GetRegion = new PropertyGetRegion(null, null); this.GetRegion = new PropertyGetRegion(null, null);
} }
}")] }")]
@ -203,7 +204,7 @@ namespace NRefactoryASTGenerator.Ast
PropertyGetRegion getRegion; PropertyGetRegion getRegion;
PropertySetRegion setRegion; PropertySetRegion setRegion;
public PropertyDeclaration(Modifier modifier, List<AttributeSection> attributes, public PropertyDeclaration(Modifiers modifier, List<AttributeSection> attributes,
string name, List<ParameterDeclarationExpression> parameters) string name, List<ParameterDeclarationExpression> parameters)
: base(modifier, attributes, name, parameters) : base(modifier, attributes, name, parameters)
{} {}
@ -237,7 +238,7 @@ namespace NRefactoryASTGenerator.Ast
string name; string name;
BlockStatement body; BlockStatement body;
public DestructorDeclaration(string name, Modifier modifier, List<AttributeSection> attributes) : base(modifier, attributes) {} public DestructorDeclaration(string name, Modifiers modifier, List<AttributeSection> attributes) : base(modifier, attributes) {}
} }
[IncludeBoolProperty("HasGetRegion", "return !getRegion.IsNull;")] [IncludeBoolProperty("HasGetRegion", "return !getRegion.IsNull;")]
@ -254,11 +255,11 @@ namespace NRefactoryASTGenerator.Ast
PropertyGetRegion getRegion; PropertyGetRegion getRegion;
PropertySetRegion setRegion; PropertySetRegion setRegion;
public IndexerDeclaration(Modifier modifier, List<ParameterDeclarationExpression> parameters, List<AttributeSection> attributes) public IndexerDeclaration(Modifiers modifier, List<ParameterDeclarationExpression> parameters, List<AttributeSection> attributes)
: base(modifier, attributes) : base(modifier, attributes)
{} {}
public IndexerDeclaration(TypeReference typeReference, List<ParameterDeclarationExpression> parameters, Modifier modifier, List<AttributeSection> attributes) public IndexerDeclaration(TypeReference typeReference, List<ParameterDeclarationExpression> parameters, Modifiers modifier, List<AttributeSection> attributes)
: base(modifier, attributes) : base(modifier, attributes)
{} {}
} }
@ -272,7 +273,7 @@ namespace NRefactoryASTGenerator.Ast
CharsetModifier charset; CharsetModifier charset;
TypeReference typeReference; TypeReference typeReference;
public DeclareDeclaration(string name, Modifier modifier, TypeReference typeReference, List<ParameterDeclarationExpression> parameters, List<AttributeSection> attributes, string library, string alias, CharsetModifier charset) public DeclareDeclaration(string name, Modifiers modifier, TypeReference typeReference, List<ParameterDeclarationExpression> parameters, List<AttributeSection> attributes, string library, string alias, CharsetModifier charset)
: base(modifier, attributes, name, parameters) : base(modifier, attributes, name, parameters)
{} {}
} }

6
src/Libraries/NRefactory/Project/Src/Ast/Enums.cs

@ -1,7 +1,7 @@
// <file> // <file>
// <copyright see="prj:///doc/copyright.txt"/> // <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/> // <license see="prj:///doc/license.txt"/>
// <owner name="none" email=""/> // <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version> // <version>$Revision$</version>
// </file> // </file>
@ -43,7 +43,7 @@ namespace ICSharpCode.NRefactory.Ast
Overloads = 0x10000, // VB specific Overloads = 0x10000, // VB specific
WithEvents = 0x20000, // VB specific WithEvents = 0x20000, // VB specific
Default = 0x40000, // VB specific Default = 0x40000, // VB specific
Fixed = 0x80000, // C# specific (fixed size arrays in unsafe structs)
Synthetic = 0x200000, Synthetic = 0x200000,
/// <summary>Only for VB properties.</summary> /// <summary>Only for VB properties.</summary>
@ -70,7 +70,7 @@ namespace ICSharpCode.NRefactory.Ast
VBInterfaceProperties = New | Overloads | ReadOnly | WriteOnly | Default, VBInterfaceProperties = New | Overloads | ReadOnly | WriteOnly | Default,
VBInterfaceEnums = New, VBInterfaceEnums = New,
Fields = New | Visibility | Static | ReadOnly | Volatile, Fields = New | Visibility | Static | ReadOnly | Volatile | Fixed,
PropertysEventsMethods = New | Visibility | Static | Virtual | Sealed | Override | Abstract | Extern, PropertysEventsMethods = New | Visibility | Static | Virtual | Sealed | Override | Abstract | Extern,
Indexers = New | Visibility | Virtual | Sealed | Override | Abstract | Extern, Indexers = New | Visibility | Virtual | Sealed | Override | Abstract | Extern,
Operators = Public | Static | Extern, Operators = Public | Static | Extern,

20
src/Libraries/NRefactory/Project/Src/Ast/Generated.cs

@ -1,7 +1,7 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:2.0.50727.42 // Runtime Version:2.0.50727.88
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
@ -4252,6 +4252,8 @@ public UsingDeclaration(string @namespace, TypeReference alias) { usings = new L
TypeReference typeReference; TypeReference typeReference;
Expression fixedArrayInitialization;
public string Name { public string Name {
get { get {
return name; return name;
@ -4280,22 +4282,35 @@ public UsingDeclaration(string @namespace, TypeReference alias) { usings = new L
} }
} }
public Expression FixedArrayInitialization {
get {
return fixedArrayInitialization;
}
set {
fixedArrayInitialization = value ?? Expression.Null;
if (!fixedArrayInitialization.IsNull) fixedArrayInitialization.Parent = this;
}
}
public VariableDeclaration(string name) { public VariableDeclaration(string name) {
Name = name; Name = name;
initializer = Expression.Null; initializer = Expression.Null;
typeReference = TypeReference.Null; typeReference = TypeReference.Null;
fixedArrayInitialization = Expression.Null;
} }
public VariableDeclaration(string name, Expression initializer) { public VariableDeclaration(string name, Expression initializer) {
Name = name; Name = name;
Initializer = initializer; Initializer = initializer;
typeReference = TypeReference.Null; typeReference = TypeReference.Null;
fixedArrayInitialization = Expression.Null;
} }
public VariableDeclaration(string name, Expression initializer, TypeReference typeReference) { public VariableDeclaration(string name, Expression initializer, TypeReference typeReference) {
Name = name; Name = name;
Initializer = initializer; Initializer = initializer;
TypeReference = typeReference; TypeReference = typeReference;
fixedArrayInitialization = Expression.Null;
} }
public override object AcceptVisitor(IAstVisitor visitor, object data) { public override object AcceptVisitor(IAstVisitor visitor, object data) {
@ -4303,7 +4318,8 @@ public UsingDeclaration(string @namespace, TypeReference alias) { usings = new L
} }
public override string ToString() { public override string ToString() {
return string.Format("[VariableDeclaration Name={0} Initializer={1} TypeReference={2}]", Name, Initializer, TypeReference); return string.Format("[VariableDeclaration Name={0} Initializer={1} TypeReference={2} FixedArrayInitial" +
"ization={3}]", Name, Initializer, TypeReference, FixedArrayInitialization);
} }
} }

2
src/Libraries/NRefactory/Project/Src/IAstVisitor.cs

@ -1,7 +1,7 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:2.0.50727.42 // Runtime Version:2.0.50727.88
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.

7
src/Libraries/NRefactory/Project/Src/Parser/CSharp/CSharpParser.cs

@ -252,13 +252,12 @@ namespace ICSharpCode.NRefactory.Parser.CSharp
bool IsAssignment () { return IdentAndAsgn(); } bool IsAssignment () { return IdentAndAsgn(); }
/* True, if ident is followed by ",", "=", or ";" */ /* True, if ident is followed by ",", "=", "[" or ";" */
bool IdentAndCommaOrAsgnOrSColon () { bool IsVarDecl () {
int peek = Peek(1).kind; int peek = Peek(1).kind;
return la.kind == Tokens.Identifier && return la.kind == Tokens.Identifier &&
(peek == Tokens.Comma || peek == Tokens.Assign || peek == Tokens.Semicolon); (peek == Tokens.Comma || peek == Tokens.Assign || peek == Tokens.Semicolon || peek == Tokens.OpenSquareBracket);
} }
bool IsVarDecl () { return IdentAndCommaOrAsgnOrSColon(); }
/* True, if the comma is not a trailing one, * /* True, if the comma is not a trailing one, *
* like the last one in: a, b, c, */ * like the last one in: a, b, c, */

1738
src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs

File diff suppressed because it is too large Load Diff

29
src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG

@ -685,6 +685,7 @@ MemberModifiers<ModifierList m>
| "readonly" (. m.Add(Modifiers.ReadOnly, t.Location); .) | "readonly" (. m.Add(Modifiers.ReadOnly, t.Location); .)
| "sealed" (. m.Add(Modifiers.Sealed, t.Location); .) | "sealed" (. m.Add(Modifiers.Sealed, t.Location); .)
| "static" (. m.Add(Modifiers.Static, t.Location); .) | "static" (. m.Add(Modifiers.Static, t.Location); .)
| "fixed" (. m.Add(Modifiers.Fixed, t.Location); .)
| "unsafe" (. m.Add(Modifiers.Unsafe, t.Location); .) | "unsafe" (. m.Add(Modifiers.Unsafe, t.Location); .)
| "virtual" (. m.Add(Modifiers.Virtual, t.Location); .) | "virtual" (. m.Add(Modifiers.Virtual, t.Location); .)
| "volatile" (. m.Add(Modifiers.Volatile, t.Location); .) | "volatile" (. m.Add(Modifiers.Volatile, t.Location); .)
@ -867,12 +868,28 @@ StructMemberDecl<ModifierList m, List<AttributeSection> attributes>
.) .)
/*--- field declaration: */ /*--- field declaration: */
| IF (IsVarDecl()) (. m.Check(Modifiers.Fields); | IF (IsVarDecl())
FieldDeclaration fd = new FieldDeclaration(attributes, type, m.Modifier); (. m.Check(Modifiers.Fields);
fd.StartLocation = m.GetDeclarationLocation(startPos); FieldDeclaration fd = new FieldDeclaration(attributes, type, m.Modifier);
.) fd.StartLocation = m.GetDeclarationLocation(startPos);
VariableDeclarator<variableDeclarators> .)
{ "," VariableDeclarator<variableDeclarators> } ( IF (m.Contains(Modifiers.Fixed))
VariableDeclarator<variableDeclarators>
"["
Expr<out expr> (. if (variableDeclarators.Count > 0)
variableDeclarators[variableDeclarators.Count-1].FixedArrayInitialization = expr; .)
"]"
{ ","
VariableDeclarator<variableDeclarators>
"["
Expr<out expr> (. if (variableDeclarators.Count > 0)
variableDeclarators[variableDeclarators.Count-1].FixedArrayInitialization = expr; .)
"]"
}
| /* non-fixed field */
VariableDeclarator<variableDeclarators>
{ "," VariableDeclarator<variableDeclarators> }
)
";" (. fd.EndLocation = t.EndLocation; fd.Fields = variableDeclarators; compilationUnit.AddChild(fd); .) ";" (. fd.EndLocation = t.EndLocation; fd.Fields = variableDeclarators; compilationUnit.AddChild(fd); .)
/*--- unqualified indexer declaration (without interface name): */ /*--- unqualified indexer declaration (without interface name): */

8
src/Libraries/NRefactory/Project/Src/PrettyPrinter/CSharp/CSharpOutputVisitor.cs

@ -499,6 +499,11 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
public object VisitVariableDeclaration(VariableDeclaration variableDeclaration, object data) public object VisitVariableDeclaration(VariableDeclaration variableDeclaration, object data)
{ {
outputFormatter.PrintIdentifier(variableDeclaration.Name); outputFormatter.PrintIdentifier(variableDeclaration.Name);
if (!variableDeclaration.FixedArrayInitialization.IsNull) {
outputFormatter.PrintToken(Tokens.OpenSquareBracket);
nodeTracker.TrackedVisit(variableDeclaration.FixedArrayInitialization, data);
outputFormatter.PrintToken(Tokens.CloseSquareBracket);
}
if (!variableDeclaration.Initializer.IsNull) { if (!variableDeclaration.Initializer.IsNull) {
outputFormatter.Space(); outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Assign); outputFormatter.PrintToken(Tokens.Assign);
@ -2424,6 +2429,9 @@ namespace ICSharpCode.NRefactory.PrettyPrinter
if ((modifier & Modifiers.Volatile) != 0) { if ((modifier & Modifiers.Volatile) != 0) {
tokenList.Add(Tokens.Volatile); tokenList.Add(Tokens.Volatile);
} }
if ((modifier & Modifiers.Fixed) != 0) {
tokenList.Add(Tokens.Fixed);
}
outputFormatter.PrintTokenList(tokenList); outputFormatter.PrintTokenList(tokenList);
if ((modifier & Modifiers.Partial) != 0) { if ((modifier & Modifiers.Partial) != 0) {

6
src/Libraries/NRefactory/Project/Src/Visitors/AbstractASTVisitor.cs

@ -1,7 +1,7 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:2.0.50727.42 // Runtime Version:2.0.50727.88
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
@ -1013,8 +1013,10 @@ namespace ICSharpCode.NRefactory.Visitors {
Debug.Assert((variableDeclaration != null)); Debug.Assert((variableDeclaration != null));
Debug.Assert((variableDeclaration.Initializer != null)); Debug.Assert((variableDeclaration.Initializer != null));
Debug.Assert((variableDeclaration.TypeReference != null)); Debug.Assert((variableDeclaration.TypeReference != null));
Debug.Assert((variableDeclaration.FixedArrayInitialization != null));
variableDeclaration.Initializer.AcceptVisitor(this, data); variableDeclaration.Initializer.AcceptVisitor(this, data);
return variableDeclaration.TypeReference.AcceptVisitor(this, data); variableDeclaration.TypeReference.AcceptVisitor(this, data);
return variableDeclaration.FixedArrayInitialization.AcceptVisitor(this, data);
} }
public virtual object VisitWithStatement(WithStatement withStatement, object data) { public virtual object VisitWithStatement(WithStatement withStatement, object data) {

6
src/Libraries/NRefactory/Project/Src/Visitors/AbstractAstTransformer.cs

@ -1,7 +1,7 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:2.0.50727.42 // Runtime Version:2.0.50727.88
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
@ -1835,12 +1835,16 @@ namespace ICSharpCode.NRefactory.Visitors {
Debug.Assert((variableDeclaration != null)); Debug.Assert((variableDeclaration != null));
Debug.Assert((variableDeclaration.Initializer != null)); Debug.Assert((variableDeclaration.Initializer != null));
Debug.Assert((variableDeclaration.TypeReference != null)); Debug.Assert((variableDeclaration.TypeReference != null));
Debug.Assert((variableDeclaration.FixedArrayInitialization != null));
nodeStack.Push(variableDeclaration.Initializer); nodeStack.Push(variableDeclaration.Initializer);
variableDeclaration.Initializer.AcceptVisitor(this, data); variableDeclaration.Initializer.AcceptVisitor(this, data);
variableDeclaration.Initializer = ((Expression)(nodeStack.Pop())); variableDeclaration.Initializer = ((Expression)(nodeStack.Pop()));
nodeStack.Push(variableDeclaration.TypeReference); nodeStack.Push(variableDeclaration.TypeReference);
variableDeclaration.TypeReference.AcceptVisitor(this, data); variableDeclaration.TypeReference.AcceptVisitor(this, data);
variableDeclaration.TypeReference = ((TypeReference)(nodeStack.Pop())); variableDeclaration.TypeReference = ((TypeReference)(nodeStack.Pop()));
nodeStack.Push(variableDeclaration.FixedArrayInitialization);
variableDeclaration.FixedArrayInitialization.AcceptVisitor(this, data);
variableDeclaration.FixedArrayInitialization = ((Expression)(nodeStack.Pop()));
return null; return null;
} }

18
src/Libraries/NRefactory/Test/Output/CSharp/CSharpOutputTest.cs

@ -394,5 +394,23 @@ namespace ICSharpCode.NRefactory.Tests.PrettyPrinter
{ {
TestProgram("public struct Rational<T, O> where O : class\n{\n}"); TestProgram("public struct Rational<T, O> where O : class\n{\n}");
} }
[Test]
public void FixedStructField()
{
TestProgram(@"unsafe struct CrudeMessage
{
public fixed byte data[256];
}");
}
[Test]
public void FixedStructField2()
{
TestProgram(@"unsafe struct CrudeMessage
{
fixed byte data[4 * sizeof(int)], data2[10];
}");
}
} }
} }

1
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/Interfaces/ModifierEnum.cs

@ -40,6 +40,7 @@ namespace ICSharpCode.SharpDevelop.Dom
Overloads = M.Overloads, // VB specific Overloads = M.Overloads, // VB specific
WithEvents = M.WithEvents, // VB specific WithEvents = M.WithEvents, // VB specific
Default = M.Default, // VB specific Default = M.Default, // VB specific
Fixed = M.Fixed,
Synthetic = M.Synthetic, Synthetic = M.Synthetic,

7
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/NRefactoryResolver/NRefactoryASTConvertVisitor.cs

@ -526,10 +526,13 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
AST.VariableDeclaration field = (AST.VariableDeclaration)fieldDeclaration.Fields[i]; AST.VariableDeclaration field = (AST.VariableDeclaration)fieldDeclaration.Fields[i];
IReturnType retType; IReturnType retType;
if (c.ClassType == ClassType.Enum) if (c.ClassType == ClassType.Enum) {
retType = c.DefaultReturnType; retType = c.DefaultReturnType;
else } else {
retType = CreateReturnType(fieldDeclaration.GetTypeForField(i)); retType = CreateReturnType(fieldDeclaration.GetTypeForField(i));
if (!field.FixedArrayInitialization.IsNull)
retType = new ArrayReturnType(cu.ProjectContent, retType, 1);
}
DefaultField f = new DefaultField(retType, field.Name, modifier, region, c); DefaultField f = new DefaultField(retType, field.Name, modifier, region, c);
ConvertAttributes(fieldDeclaration, f); ConvertAttributes(fieldDeclaration, f);
f.Documentation = doku; f.Documentation = doku;

27
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/XmlDoc.cs

@ -65,7 +65,7 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
} }
void ReadMembersSection(XmlTextReader reader) void ReadMembersSection(XmlReader reader)
{ {
while (reader.Read()) { while (reader.Read()) {
switch (reader.NodeType) { switch (reader.NodeType) {
@ -246,17 +246,15 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
#endregion #endregion
public static XmlDoc Load(TextReader textReader) public static XmlDoc Load(XmlReader reader)
{ {
XmlDoc newXmlDoc = new XmlDoc(); XmlDoc newXmlDoc = new XmlDoc();
using (XmlTextReader reader = new XmlTextReader(textReader)) { while (reader.Read()) {
while (reader.Read()) { if (reader.IsStartElement()) {
if (reader.IsStartElement()) { switch (reader.LocalName) {
switch (reader.LocalName) { case "members":
case "members": newXmlDoc.ReadMembersSection(reader);
newXmlDoc.ReadMembersSection(reader); break;
break;
}
} }
} }
} }
@ -283,8 +281,13 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
} }
using (TextReader textReader = File.OpenText(fileName)) { try {
doc = Load(textReader); using (XmlTextReader xmlReader = new XmlTextReader(fileName)) {
doc = Load(xmlReader);
}
} catch (XmlException ex) {
LoggingService.Warn("Error loading XmlDoc", ex);
return new XmlDoc();
} }
if (doc.xmlDescription.Count > cacheLength * 2) { if (doc.xmlDescription.Count > cacheLength * 2) {

Loading…
Cancel
Save