Browse Source

implement XamlParser

newNRvisualizers
Siegfried Pammer 14 years ago
parent
commit
c0a13242a2
  1. 21
      SharpDevelop.sln
  2. 5
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBehavior.cs
  3. 1
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.csproj
  4. 32
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlFullParseInformation.cs
  5. 99
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlParsedFile.cs
  6. 18
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlParser.cs
  7. 2
      src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlAttribute.cs
  8. 7
      src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlDocument.cs
  9. 2
      src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlElement.cs
  10. 2
      src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlObject.cs
  11. 2
      src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlTag.cs
  12. 2
      src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlText.cs
  13. 47
      src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlVisitor.cs
  14. 2
      src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/ICSharpCode.NRefactory.Xml.csproj

21
SharpDevelop.sln

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
# SharpDevelop 4.2.0.8662-Beta 2
# SharpDevelop 4.2.0.8680-Beta 2
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{256F5C28-532C-44C0-8AB8-D8EC5E492E01}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
@ -115,6 +115,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FSharpBinding", "src\AddIns @@ -115,6 +115,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FSharpBinding", "src\AddIns
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CppBinding", "src\AddIns\BackendBindings\CppBinding\CppBinding\CppBinding.csproj", "{70966F84-74C9-4067-A379-0C674A929233}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlBinding", "src\AddIns\BackendBindings\XamlBinding\XamlBinding\XamlBinding.csproj", "{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{F3662720-9EA2-4591-BBC6-97361DCE50A9}"
ProjectSection(SolutionItems) = postProject
EndProjectSection
@ -541,6 +543,22 @@ Global @@ -541,6 +543,22 @@ Global
{DCA2703D-250A-463E-A68A-07ED105AE6BD}.Release|x86.ActiveCfg = Release|Any CPU
{DCA2703D-250A-463E-A68A-07ED105AE6BD}.Release|Debug.Build.0 = Release|Any CPU
{DCA2703D-250A-463E-A68A-07ED105AE6BD}.Release|Debug.ActiveCfg = Release|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Debug|Win32.Build.0 = Debug|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Debug|Win32.ActiveCfg = Debug|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Debug|x86.Build.0 = Debug|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Debug|x86.ActiveCfg = Debug|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Debug|Debug.Build.0 = Debug|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Debug|Debug.ActiveCfg = Debug|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Release|Any CPU.Build.0 = Release|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Release|Win32.Build.0 = Release|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Release|Win32.ActiveCfg = Release|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Release|x86.Build.0 = Release|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Release|x86.ActiveCfg = Release|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Release|Debug.Build.0 = Release|Any CPU
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8}.Release|Debug.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -574,6 +592,7 @@ Global @@ -574,6 +592,7 @@ Global
{1F1AC7CD-D154-45BB-8EAF-804CA8055F5A} = {E0646C25-36F2-4524-969F-FA621353AB94}
{E954F3CB-A446-492F-A664-2B376EBC86E8} = {E0646C25-36F2-4524-969F-FA621353AB94}
{70966F84-74C9-4067-A379-0C674A929233} = {E0646C25-36F2-4524-969F-FA621353AB94}
{7C96B65D-28A5-4F28-A35B-8D83CE831EE8} = {E0646C25-36F2-4524-969F-FA621353AB94}
{9196DD8A-B4D4-4780-8742-C5762E547FC2} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{7D5C266F-D6FF-4D14-B315-0C0FC6C4EF51} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}
{4B8F0F98-8BE1-402B-AA8B-C8D548577B38} = {F3662720-9EA2-4591-BBC6-97361DCE50A9}

5
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBehavior.cs

@ -17,6 +17,11 @@ namespace ICSharpCode.XamlBinding @@ -17,6 +17,11 @@ namespace ICSharpCode.XamlBinding
{
public class XamlBehavior : ProjectBehavior
{
/// <summary>
/// value: http://schemas.microsoft.com/winfx/2006/xaml
/// </summary>
public const string XamlNamespace = "http://schemas.microsoft.com/winfx/2006/xaml";
public override ItemType GetDefaultItemType(string fileName)
{
if (".xaml".Equals(Path.GetExtension(fileName), StringComparison.OrdinalIgnoreCase))

1
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlBinding.csproj

@ -64,6 +64,7 @@ @@ -64,6 +64,7 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="XamlFullParseInformation.cs" />
<Compile Include="XamlParsedFile.cs" />
<Compile Include="XamlSymbolSearch.cs" />
<None Include="XamlBinding.addin">

32
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlFullParseInformation.cs

@ -0,0 +1,32 @@ @@ -0,0 +1,32 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.NRefactory.Xml;
using ICSharpCode.SharpDevelop.Parser;
namespace ICSharpCode.XamlBinding
{
public class XamlFullParseInformation : ParseInformation
{
readonly AXmlDocument document;
public XamlFullParseInformation(XamlParsedFile parsedFile, AXmlDocument document)
: base(parsedFile, true)
{
if (parsedFile == null)
throw new ArgumentNullException("parsedFile");
if (document == null)
throw new ArgumentNullException("document");
this.document = document;
}
public new XamlParsedFile ParsedFile {
get { return (XamlParsedFile)base.ParsedFile; }
}
public AXmlDocument Document {
get { return document; }
}
}
}

99
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlParsedFile.cs

@ -3,10 +3,10 @@ @@ -3,10 +3,10 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Threading;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.Core;
using ICSharpCode.NRefactory;
@ -27,7 +27,7 @@ namespace ICSharpCode.XamlBinding @@ -27,7 +27,7 @@ namespace ICSharpCode.XamlBinding
FileName fileName;
AXmlDocument document;
List<Error> errors;
ITypeDefinition xamlTypeDefinition;
IUnresolvedTypeDefinition[] topLevel;
XamlParsedFile(FileName fileName, AXmlDocument document)
{
@ -36,11 +36,14 @@ namespace ICSharpCode.XamlBinding @@ -36,11 +36,14 @@ namespace ICSharpCode.XamlBinding
this.errors = new List<Error>();
}
public static XamlParsedFile Create(FileName fileName, string fileContent, AXmlDocument document)
public static XamlParsedFile Create(FileName fileName, ITextSource fileContent, AXmlDocument document)
{
XamlParsedFile file = new XamlParsedFile(fileName, document);
file.errors.AddRange(document.SyntaxErrors.Select(err => new Error(ErrorType.Error, err.Description)));
var visitor = new XamlDocumentVisitor(file, fileContent);
visitor.VisitDocument(document);
file.topLevel = new[] { visitor.TypeDefinition };
file.lastWriteTime = DateTime.UtcNow;
return file;
@ -57,9 +60,7 @@ namespace ICSharpCode.XamlBinding @@ -57,9 +60,7 @@ namespace ICSharpCode.XamlBinding
}
public IList<IUnresolvedTypeDefinition> TopLevelTypeDefinitions {
get {
throw new NotImplementedException();
}
get { return topLevel; }
}
public IList<IUnresolvedAttribute> AssemblyAttributes {
@ -76,22 +77,102 @@ namespace ICSharpCode.XamlBinding @@ -76,22 +77,102 @@ namespace ICSharpCode.XamlBinding
public IUnresolvedTypeDefinition GetTopLevelTypeDefinition(TextLocation location)
{
throw new NotImplementedException();
foreach (var td in topLevel) {
if (td.Region.IsInside(location))
return td;
}
return null;
}
public IUnresolvedTypeDefinition GetInnermostTypeDefinition(TextLocation location)
{
throw new NotImplementedException();
return GetTopLevelTypeDefinition(location);
}
public IUnresolvedMember GetMember(TextLocation location)
{
throw new NotImplementedException();
var td = GetInnermostTypeDefinition(location);
if (td != null) {
foreach (var md in td.Members) {
if (md.Region.IsInside(location))
return md;
}
}
return null;
}
public ITypeResolveContext GetTypeResolveContext(ICompilation compilation, TextLocation loc)
{
throw new NotImplementedException();
}
class XamlDocumentVisitor : AXmlVisitor
{
public DefaultUnresolvedTypeDefinition TypeDefinition { get; private set; }
IParsedFile file;
AXmlDocument currentDocument;
AXmlElement rootElement;
ReadOnlyDocument textDocument;
public XamlDocumentVisitor(IParsedFile file, ITextSource fileContent)
{
this.file = file;
textDocument = new ReadOnlyDocument(fileContent);
}
public override void VisitDocument(AXmlDocument document)
{
currentDocument = document;
rootElement = currentDocument.Children.OfType<AXmlElement>().FirstOrDefault();
base.VisitDocument(document);
}
public override void VisitAttribute(AXmlAttribute attribute)
{
if (attribute.Namespace == XamlBehavior.XamlNamespace) {
string prefix = attribute.Prefix;
switch (attribute.LocalName) {
case "Class":
if (attribute.ParentElement == rootElement) {
TypeDefinition = new DefaultUnresolvedTypeDefinition(attribute.Value) {
Kind = TypeKind.Class,
ParsedFile = file,
Region = new DomRegion(file.FileName, textDocument.GetLocation(rootElement.StartOffset), textDocument.GetLocation(rootElement.EndOffset))
};
TypeDefinition.Members.Add(
new DefaultUnresolvedMethod(TypeDefinition, "InitializeComponent") {
Accessibility = Accessibility.Public,
ReturnType = KnownTypeReference.Void
});
}
break;
case "Name":
if (TypeDefinition != null) {
var field = new DefaultUnresolvedField(TypeDefinition, attribute.Value);
if (attribute.ParentElement != null) {
var modifier = attribute.ParentElement.Attributes.FirstOrDefault(a => a.Prefix == prefix && a.LocalName == "FieldModifier");
field.Accessibility = Accessibility.Internal;
field.Region = new DomRegion(file.FileName, textDocument.GetLocation(attribute.ParentElement.StartOffset), textDocument.GetLocation(attribute.ParentElement.EndOffset));
if (modifier != null) {
field.Accessibility = ParseAccessibility(modifier.Value);
}
}
TypeDefinition.Members.Add(field);
}
break;
}
}
base.VisitAttribute(attribute);
}
Accessibility ParseAccessibility(string value)
{
if ("public".Equals(value.Trim(), StringComparison.OrdinalIgnoreCase))
return Accessibility.Public;
return Accessibility.Internal;
}
}
}
}

18
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlParser.cs

@ -131,21 +131,19 @@ namespace ICSharpCode.XamlBinding @@ -131,21 +131,19 @@ namespace ICSharpCode.XamlBinding
// return compilationUnit;
// }
volatile IncrementalParserState parserState = null;
volatile IncrementalParserState parserState;
public ParseInformation Parse(FileName fileName, ITextSource fileContent, bool fullParseInformationRequested)
{
AXmlParser parser = new AXmlParser();
AXmlDocument document;
try {
document = parser.ParseIncremental(parserState, fileContent, out parserState);
} catch (Exception ex) {
LoggingService.Error(ex);
document = null; // TODO empty document?
}
XamlParsedFile parsedFile = XamlParsedFile.Create(fileName, fileContent.Text, document);
IncrementalParserState newParserState;
document = parser.ParseIncremental(parserState, fileContent, out newParserState);
parserState = newParserState;
XamlParsedFile parsedFile = XamlParsedFile.Create(fileName, fileContent, document);
// TODO if (fullParseInformationRequested)
if (fullParseInformationRequested)
return new XamlFullParseInformation(parsedFile, document);
return new ParseInformation(parsedFile, false);
}
@ -159,6 +157,4 @@ namespace ICSharpCode.XamlBinding @@ -159,6 +157,4 @@ namespace ICSharpCode.XamlBinding
throw new NotImplementedException();
}
}
}

2
src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlAttribute.cs

@ -104,7 +104,7 @@ namespace ICSharpCode.NRefactory.Xml @@ -104,7 +104,7 @@ namespace ICSharpCode.NRefactory.Xml
}
/// <inheritdoc/>
public override void AcceptVisitor(IAXmlVisitor visitor)
public override void AcceptVisitor(AXmlVisitor visitor)
{
visitor.VisitAttribute(this);
}

7
src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlDocument.cs

@ -45,7 +45,7 @@ namespace ICSharpCode.NRefactory.Xml @@ -45,7 +45,7 @@ namespace ICSharpCode.NRefactory.Xml
}
/// <inheritdoc/>
public override void AcceptVisitor(IAXmlVisitor visitor)
public override void AcceptVisitor(AXmlVisitor visitor)
{
visitor.VisitDocument(this);
}
@ -55,5 +55,10 @@ namespace ICSharpCode.NRefactory.Xml @@ -55,5 +55,10 @@ namespace ICSharpCode.NRefactory.Xml
{
return string.Format(CultureInfo.InvariantCulture, "[{0} Chld:{1}]", base.ToString(), this.Children.Count);
}
/// <summary>
/// Represents an empty document.
/// </summary>
public readonly static AXmlDocument Empty = new AXmlDocument(null, 0, new InternalDocument());
}
}

2
src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlElement.cs

@ -164,7 +164,7 @@ namespace ICSharpCode.NRefactory.Xml @@ -164,7 +164,7 @@ namespace ICSharpCode.NRefactory.Xml
}
/// <inheritdoc/>
public override void AcceptVisitor(IAXmlVisitor visitor)
public override void AcceptVisitor(AXmlVisitor visitor)
{
visitor.VisitElement(this);
}

2
src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlObject.cs

@ -180,7 +180,7 @@ namespace ICSharpCode.NRefactory.Xml @@ -180,7 +180,7 @@ namespace ICSharpCode.NRefactory.Xml
#endregion
/// <summary> Call appropriate visit method on the given visitor </summary>
public abstract void AcceptVisitor(IAXmlVisitor visitor);
public abstract void AcceptVisitor(AXmlVisitor visitor);
/// <summary>
/// Gets the start offset of the segment.

2
src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlTag.cs

@ -84,7 +84,7 @@ namespace ICSharpCode.NRefactory.Xml @@ -84,7 +84,7 @@ namespace ICSharpCode.NRefactory.Xml
public bool IsUnknownBang { get { return internalObject.IsUnknownBang; } }
/// <inheritdoc/>
public override void AcceptVisitor(IAXmlVisitor visitor)
public override void AcceptVisitor(AXmlVisitor visitor)
{
visitor.VisitTag(this);
}

2
src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlText.cs

@ -49,7 +49,7 @@ namespace ICSharpCode.NRefactory.Xml @@ -49,7 +49,7 @@ namespace ICSharpCode.NRefactory.Xml
}
/// <inheritdoc/>
public override void AcceptVisitor(IAXmlVisitor visitor)
public override void AcceptVisitor(AXmlVisitor visitor)
{
visitor.VisitText(this);
}

47
src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/IAXmlVisitor.cs → src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/AXmlVisitor.cs

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
@ -17,27 +17,46 @@ @@ -17,27 +17,46 @@
// DEALINGS IN THE SOFTWARE.
using System;
using System.Text;
namespace ICSharpCode.NRefactory.Xml
{
/// <summary>
/// Visitor for the XML tree
/// Derive from this class to create visitor for the XML tree
/// </summary>
public interface IAXmlVisitor
public abstract class AXmlVisitor
{
/// <summary> Visit document </summary>
void VisitDocument(AXmlDocument document);
/// <summary> Visit AXmlDocument </summary>
public virtual void VisitDocument(AXmlDocument document)
{
foreach (AXmlObject child in document.Children)
child.AcceptVisitor(this);
}
/// <summary> Visit tag </summary>
void VisitTag(AXmlTag tag);
/// <summary> Visit AXmlElement </summary>
public virtual void VisitElement(AXmlElement element)
{
foreach (AXmlObject child in element.Children)
child.AcceptVisitor(this);
}
/// <summary> Visit attribute </summary>
void VisitAttribute(AXmlAttribute attribute);
/// <summary> Visit AXmlTag </summary>
public virtual void VisitTag(AXmlTag tag)
{
foreach (AXmlObject child in tag.Children)
child.AcceptVisitor(this);
}
/// <summary> Visit text </summary>
void VisitText(AXmlText text);
/// <summary> Visit AXmlAttribute </summary>
public virtual void VisitAttribute(AXmlAttribute attribute)
{
}
/// <summary> Visit element </summary>
void VisitElement(AXmlElement element);
/// <summary> Visit AXmlText </summary>
public virtual void VisitText(AXmlText text)
{
}
}
}
}

2
src/Libraries/NRefactory/ICSharpCode.NRefactory.Xml/ICSharpCode.NRefactory.Xml.csproj

@ -68,8 +68,8 @@ @@ -68,8 +68,8 @@
<Compile Include="AXmlReader.cs" />
<Compile Include="AXmlTag.cs" />
<Compile Include="AXmlText.cs" />
<Compile Include="AXmlVisitor.cs" />
<Compile Include="DocumentationElement.cs" />
<Compile Include="IAXmlVisitor.cs" />
<Compile Include="IncrementalParserState.cs" />
<Compile Include="InternalDocument.cs" />
<Compile Include="ObjectIterator.cs" />

Loading…
Cancel
Save