📄 parserservice.cs
字号:
}
if (!(fileName == null || fileName.Length == 0)) {
ParseInformation parseInformation = null;
bool updated = false;
if (text == null) {
text = editable.Text;
if (text == null) return;
}
int hash = text.GetHashCode();
if (!lastUpdateHash.ContainsKey(fileName) || lastUpdateHash[fileName] != hash) {
parseInformation = ParseFile(fileName, text, !viewContent.IsUntitled, true);
lastUpdateHash[fileName] = hash;
updated = true;
}
if (updated) {
if (parseInformation != null && editable is IParseInformationListener) {
((IParseInformationListener)editable).ParseInformationUpdated(parseInformation);
}
}
OnParserUpdateStepFinished(new ParserUpdateStepEventArgs(fileName, text, updated));
}
}
}
}
public static void ParseViewContent(IViewContent viewContent)
{
string text = ((IEditable)viewContent).Text;
ParseInformation parseInformation = ParseFile(viewContent.IsUntitled ? viewContent.UntitledName : viewContent.FileName,
text, !viewContent.IsUntitled, true);
if (parseInformation != null && viewContent is IParseInformationListener) {
((IParseInformationListener)viewContent).ParseInformationUpdated(parseInformation);
}
}
/// <summary>
/// <para>This event is called every two seconds. It is called directly after the parser has updated the
/// project content and it is called after the parser noticed that there is nothing to update.</para>
/// <para><b>WARNING: This event is called on the parser thread - You need to use Invoke if you do
/// anything in your event handler that could touch the GUI.</b></para>
/// </summary>
public static event ParserUpdateStepEventHandler ParserUpdateStepFinished;
static void OnParserUpdateStepFinished(ParserUpdateStepEventArgs e)
{
if (ParserUpdateStepFinished != null) {
ParserUpdateStepFinished(typeof(ParserService), e);
}
}
public static ParseInformation ParseFile(string fileName)
{
return ParseFile(fileName, null);
}
public static ParseInformation ParseFile(string fileName, string fileContent)
{
return ParseFile(fileName, fileContent, true, true);
}
static IProjectContent GetProjectContent(string fileName)
{
lock (projectContents) {
foreach (KeyValuePair<IProject, IProjectContent> projectContent in projectContents) {
if (projectContent.Key.IsFileInProject(fileName)) {
return projectContent.Value;
}
}
}
return null;
}
static DefaultProjectContent defaultProjectContent;
public static IProjectContent DefaultProjectContent {
get {
if (defaultProjectContent == null) {
lock (projectContents) {
if (defaultProjectContent == null) {
CreateDefaultProjectContent();
}
}
}
return defaultProjectContent;
}
}
static void CreateDefaultProjectContent()
{
LoggingService.Info("Creating default project content");
LoggingService.Debug("Stacktrace is:\n" + Environment.StackTrace);
defaultProjectContent = new DefaultProjectContent();
defaultProjectContent.ReferencedContents.Add(ProjectContentRegistry.Mscorlib);
string[] defaultReferences = new string[] {
"System",
"System.Data",
"System.Drawing",
"System.Windows.Forms",
"System.XML",
"Microsoft.VisualBasic",
};
foreach (string defaultReference in defaultReferences) {
ReferenceProjectItem item = new ReferenceProjectItem(null, defaultReference);
IProjectContent pc = ProjectContentRegistry.GetProjectContentForReference(item);
if (pc != null) {
defaultProjectContent.ReferencedContents.Add(pc);
}
}
WorkbenchSingleton.Workbench.ActiveWorkbenchWindowChanged += delegate {
if (WorkbenchSingleton.Workbench.ActiveWorkbenchWindow != null) {
string file = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent.FileName
?? WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ViewContent.UntitledName;
if (file != null) {
IParser parser = GetParser(file);
if (parser != null && parser.Language != null) {
defaultProjectContent.Language = parser.Language;
defaultProjectContent.DefaultImports = parser.Language.CreateDefaultImports(defaultProjectContent);
}
}
}
};
}
public static ParseInformation ParseFile(string fileName, string fileContent, bool updateCommentTags, bool fireUpdate)
{
return ParseFile(null, fileName, fileContent, updateCommentTags, fireUpdate);
}
public static ParseInformation ParseFile(IProjectContent fileProjectContent, string fileName, string fileContent, bool updateCommentTags, bool fireUpdate)
{
IParser parser = GetParser(fileName);
if (parser == null) {
return null;
}
ICompilationUnit parserOutput = null;
if (fileContent == null) {
if (ProjectService.OpenSolution != null) {
IProject project = ProjectService.OpenSolution.FindProjectContainingFile(fileName);
if (project != null)
fileContent = project.GetParseableFileContent(fileName);
}
}
try {
if (fileProjectContent == null) {
// GetProjectContent is expensive because it compares all file names, so
// we accept the project content as optional parameter.
fileProjectContent = GetProjectContent(fileName);
if (fileProjectContent == null) {
fileProjectContent = DefaultProjectContent;
}
}
if (fileContent != null) {
parserOutput = parser.Parse(fileProjectContent, fileName, fileContent);
} else {
if (!File.Exists(fileName)) {
return null;
}
parserOutput = parser.Parse(fileProjectContent, fileName);
}
if (parsings.ContainsKey(fileName)) {
ParseInformation parseInformation = parsings[fileName];
fileProjectContent.UpdateCompilationUnit(parseInformation.MostRecentCompilationUnit, parserOutput as ICompilationUnit, fileName, updateCommentTags);
} else {
fileProjectContent.UpdateCompilationUnit(null, parserOutput, fileName, updateCommentTags);
}
return UpdateParseInformation(parserOutput as ICompilationUnit, fileName, updateCommentTags, fireUpdate);
} catch (Exception e) {
MessageService.ShowError(e);
}
return null;
}
public static ParseInformation UpdateParseInformation(ICompilationUnit parserOutput, string fileName, bool updateCommentTags, bool fireEvent)
{
if (!parsings.ContainsKey(fileName)) {
parsings[fileName] = new ParseInformation();
}
ParseInformation parseInformation = parsings[fileName];
if (fireEvent) {
try {
OnParseInformationUpdated(new ParseInformationEventArgs(fileName, parseInformation, parserOutput));
} catch (Exception e) {
MessageService.ShowError(e);
}
}
if (parserOutput.ErrorsDuringCompile) {
parseInformation.DirtyCompilationUnit = parserOutput;
} else {
parseInformation.ValidCompilationUnit = parserOutput;
parseInformation.DirtyCompilationUnit = null;
}
return parseInformation;
}
public static string GetParseableFileContent(string fileName)
{
IWorkbenchWindow window = FileService.GetOpenFile(fileName);
if (window != null) {
IViewContent viewContent = window.ViewContent;
IEditable editable = viewContent as IEditable;
if (editable != null) {
return editable.Text;
}
}
//string res = project.GetParseableFileContent(fileName);
//if (res != null)
// return res;
// load file
Encoding tmp = DefaultFileEncoding;
return ICSharpCode.TextEditor.Util.FileReader.ReadFileContent(fileName, ref tmp, tmp);
}
public static Encoding DefaultFileEncoding {
get {
Properties textEditorProperties = PropertyService.Get("ICSharpCode.TextEditor.Document.Document.DefaultDocumentAggregatorProperties", new Properties());
return Encoding.GetEncoding(textEditorProperties.Get("Encoding", 1252));
}
}
public static ParseInformation GetParseInformation(string fileName)
{
if (fileName == null || fileName.Length == 0) {
return null;
}
if (!parsings.ContainsKey(fileName)) {
return ParseFile(fileName);
}
return parsings[fileName];
}
public static void ClearParseInformation(string fileName)
{
if (fileName == null || fileName.Length == 0) {
return;
}
LoggingService.Info("ClearParseInformation: " + fileName);
if (parsings.ContainsKey(fileName)) {
ParseInformation parseInfo = parsings[fileName];
if (parseInfo != null && parseInfo.MostRecentCompilationUnit != null) {
parseInfo.MostRecentCompilationUnit.ProjectContent.RemoveCompilationUnit(parseInfo.MostRecentCompilationUnit);
}
parsings.Remove(fileName);
OnParseInformationUpdated(new ParseInformationEventArgs(fileName, parseInfo, null));
}
}
public static IExpressionFinder GetExpressionFinder(string fileName)
{
IParser parser = GetParser(fileName);
if (parser != null) {
return parser.CreateExpressionFinder(fileName);
}
return null;
}
public static readonly string[] DefaultTaskListTokens = {"HACK", "TODO", "UNDONE", "FIXME"};
public static IParser GetParser(string fileName)
{
IParser curParser = null;
foreach (ParserDescriptor descriptor in parser) {
if (descriptor.CanParse(fileName)) {
curParser = descriptor.Parser;
break;
}
}
if (curParser != null) {
curParser.LexerTags = PropertyService.Get("SharpDevelop.TaskListTokens", DefaultTaskListTokens);
}
return curParser;
}
////////////////////////////////////
public static ArrayList CtrlSpace(int caretLine, int caretColumn, string fileName, string fileContent, ExpressionContext context)
{
IResolver resolver = CreateResolver(fileName);
if (resolver != null) {
return resolver.CtrlSpace(caretLine, caretColumn, fileName, fileContent, context);
}
return null;
}
public static IResolver CreateResolver(string fileName)
{
IParser parser = GetParser(fileName);
if (parser != null) {
return parser.CreateResolver();
}
return null;
}
public static ResolveResult Resolve(ExpressionResult expressionResult,
int caretLineNumber,
int caretColumn,
string fileName,
string fileContent)
{
IResolver resolver = CreateResolver(fileName);
if (resolver != null) {
return resolver.Resolve(expressionResult, caretLineNumber, caretColumn, fileName, fileContent);
}
return null;
}
static void OnParseInformationUpdated(ParseInformationEventArgs e)
{
if (ParseInformationUpdated != null) {
ParseInformationUpdated(null, e);
}
}
static void OnLoadSolutionProjectsThreadEnded(EventArgs e)
{
if (LoadSolutionProjectsThreadEnded != null) {
LoadSolutionProjectsThreadEnded(null, e);
}
}
public static event ParseInformationEventHandler ParseInformationUpdated;
public static event EventHandler LoadSolutionProjectsThreadEnded;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -