//
//
//
//
// $Revision$
//
using System;
using System.Text;
using System.IO;
using System.Drawing;
using System.Collections;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver;
//using ICSharpCode.NRefactory.Parser;
namespace VBNetBinding.Parser
{
public class TParser : IParser
{
///IParser Interface
string[] lexerTags;
public string[] LexerTags {
get {
return lexerTags;
}
set {
lexerTags = value;
}
}
public LanguageProperties Language {
get {
return LanguageProperties.VBNet;
}
}
public IExpressionFinder CreateExpressionFinder(string fileName)
{
return new ExpressionFinder();
}
public bool CanParse(string fileName)
{
return Path.GetExtension(fileName).Equals(".VB", StringComparison.OrdinalIgnoreCase);
}
public bool CanParse(IProject project)
{
return project.Language == "VBNet";
}
void RetrieveRegions(ICompilationUnit cu, ICSharpCode.NRefactory.Parser.SpecialTracker tracker)
{
for (int i = 0; i < tracker.CurrentSpecials.Count; ++i)
{
ICSharpCode.NRefactory.Parser.PreProcessingDirective directive = tracker.CurrentSpecials[i] as ICSharpCode.NRefactory.Parser.PreProcessingDirective;
if (directive != null)
{
if (directive.Cmd.Equals("#region", StringComparison.OrdinalIgnoreCase))
{
int deep = 1;
for (int j = i + 1; j < tracker.CurrentSpecials.Count; ++j)
{
ICSharpCode.NRefactory.Parser.PreProcessingDirective nextDirective = tracker.CurrentSpecials[j] as ICSharpCode.NRefactory.Parser.PreProcessingDirective;
if (nextDirective != null)
{
switch (nextDirective.Cmd.ToLowerInvariant())
{
case "#region":
++deep;
break;
case "#end":
if (nextDirective.Arg.Equals("region", StringComparison.OrdinalIgnoreCase)) {
--deep;
if (deep == 0) {
cu.FoldingRegions.Add(new FoldingRegion(directive.Arg.Trim('"'), new DomRegion(directive.StartPosition, nextDirective.EndPosition)));
goto end;
}
}
break;
}
}
}
end: ;
}
}
}
}
public ICompilationUnit Parse(IProjectContent projectContent, string fileName)
{
using (ICSharpCode.NRefactory.Parser.IParser p = ICSharpCode.NRefactory.Parser.ParserFactory.CreateParser(fileName, ParserService.DefaultFileEncoding)) {
return Parse(p, fileName, projectContent);
}
}
public ICompilationUnit Parse(IProjectContent projectContent, string fileName, string fileContent)
{
using (ICSharpCode.NRefactory.Parser.IParser p = ICSharpCode.NRefactory.Parser.ParserFactory.CreateParser(ICSharpCode.NRefactory.Parser.SupportedLanguage.VBNet, new StringReader(fileContent))) {
return Parse(p, fileName, projectContent);
}
}
ICompilationUnit Parse(ICSharpCode.NRefactory.Parser.IParser p, string fileName, IProjectContent projectContent)
{
p.Lexer.SpecialCommentTags = lexerTags;
p.Parse();
NRefactoryASTConvertVisitor visitor = new NRefactoryASTConvertVisitor(projectContent);
visitor.Specials = p.Lexer.SpecialTracker.CurrentSpecials;
visitor.Visit(p.CompilationUnit, null);
visitor.Cu.FileName = fileName;
visitor.Cu.ErrorsDuringCompile = p.Errors.count > 0;
RetrieveRegions(visitor.Cu, p.Lexer.SpecialTracker);
AddCommentTags(visitor.Cu, p.Lexer.TagComments);
string rootNamespace = null;
ParseProjectContent ppc = projectContent as ParseProjectContent;
if (ppc != null) {
rootNamespace = ppc.Project.RootNamespace;
}
if (rootNamespace != null && rootNamespace.Length > 0) {
foreach (IClass c in visitor.Cu.Classes) {
c.FullyQualifiedName = rootNamespace + "." + c.FullyQualifiedName;
}
}
return visitor.Cu;
}
void AddCommentTags(ICompilationUnit cu, System.Collections.Generic.List tagComments)
{
foreach (ICSharpCode.NRefactory.Parser.TagComment tagComment in tagComments)
{
DomRegion tagRegion = new DomRegion(tagComment.StartPosition.Y, tagComment.StartPosition.X);
ICSharpCode.SharpDevelop.Dom.Tag tag = new ICSharpCode.SharpDevelop.Dom.Tag(tagComment.Tag, tagRegion);
tag.CommentString = tagComment.CommentText;
cu.TagComments.Add(tag);
}
}
public IResolver CreateResolver()
{
return new ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRefactoryResolver(ICSharpCode.NRefactory.Parser.SupportedLanguage.VBNet);
}
///////// IParser Interface END
}
}