|
|
@@ -16,6 +16,7 @@ using System.Windows.Media; |
|
|
|
using System.Text.RegularExpressions; |
|
|
|
using System.Diagnostics; /* For debugging purposes */ |
|
|
|
|
|
|
|
using Microsoft.VisualStudio.Shell; |
|
|
|
using Microsoft.VisualStudio.Text; |
|
|
|
using Microsoft.VisualStudio.Text.Classification; |
|
|
|
using Microsoft.VisualStudio.Text.Formatting; |
|
|
@@ -37,6 +38,12 @@ internal class LolClassifierProvider : IClassifierProvider |
|
|
|
internal IClassifierAggregatorService m_aggregator = null; |
|
|
|
[Import] |
|
|
|
internal IClassificationFormatMapService m_format_map = null; |
|
|
|
#if FALSE |
|
|
|
[Import] |
|
|
|
internal ITextDocumentFactoryService m_textdoc_factory = null; |
|
|
|
#endif |
|
|
|
[Import] |
|
|
|
internal SVsServiceProvider m_sp = null; |
|
|
|
|
|
|
|
internal static bool m_inprogress = false; |
|
|
|
|
|
|
@@ -46,12 +53,26 @@ internal class LolClassifierProvider : IClassifierProvider |
|
|
|
if (m_inprogress) |
|
|
|
return null; |
|
|
|
|
|
|
|
/* Try to guess whether this is a Lol Engine project */ |
|
|
|
#if FALSE |
|
|
|
if (m_textdoc_factory != null) |
|
|
|
{ |
|
|
|
ITextDocument doc; |
|
|
|
m_textdoc_factory.TryGetTextDocument(buffer, out doc); |
|
|
|
/* print doc.FilePath */ |
|
|
|
} |
|
|
|
#endif |
|
|
|
EnvDTE.DTE dte = m_sp.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; |
|
|
|
bool islolengine = false; |
|
|
|
if (dte.Solution.FullName.Contains("Lol.sln")) |
|
|
|
islolengine = true; |
|
|
|
|
|
|
|
LolGenericFormat.SetRegistry(m_type_registry, m_format_map); |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
m_inprogress = true; |
|
|
|
return buffer.Properties.GetOrCreateSingletonProperty<CppKeywordClassifier>(delegate { return new CppKeywordClassifier(m_type_registry, m_aggregator.GetClassifier(buffer), buffer.ContentType); }); |
|
|
|
return buffer.Properties.GetOrCreateSingletonProperty<CppKeywordClassifier>(delegate { return new CppKeywordClassifier(m_type_registry, m_aggregator.GetClassifier(buffer), buffer.ContentType, islolengine); }); |
|
|
|
} |
|
|
|
finally { m_inprogress = false; } |
|
|
|
} |
|
|
@@ -60,7 +81,7 @@ internal class LolClassifierProvider : IClassifierProvider |
|
|
|
class CppKeywordClassifier : IClassifier |
|
|
|
{ |
|
|
|
private IClassifier m_classifier; |
|
|
|
private bool m_inprogress; |
|
|
|
private bool m_inprogress, m_islolengine; |
|
|
|
|
|
|
|
private IClassificationType m_types_type, m_constant_type, m_normal_type; |
|
|
|
private Regex m_types_regex, m_constant_regex, m_normal_regex; |
|
|
@@ -83,9 +104,11 @@ class CppKeywordClassifier : IClassifier |
|
|
|
"__(int(8|16|32|64)|ptr(32|64)|m(64|128|128d|128i))", |
|
|
|
}; |
|
|
|
|
|
|
|
/* ldouble real half |
|
|
|
"(f(16|128)||d|[ui](8|16||64)|r)(vec[234]|mat[234]|quat|cmplx)"; |
|
|
|
*/ |
|
|
|
private static string[] m_lol_types = |
|
|
|
{ |
|
|
|
"ldouble|real|half", |
|
|
|
"(f(16|128)||d|[ui](8|16||64)|r)(vec[234]|mat[234]|quat|cmplx)", |
|
|
|
}; |
|
|
|
|
|
|
|
private static string[] m_csharp_types = |
|
|
|
{ |
|
|
@@ -109,11 +132,16 @@ class CppKeywordClassifier : IClassifier |
|
|
|
{ |
|
|
|
"NULL|nullptr", |
|
|
|
"EXIT_SUCCESS|EXIT_FAILURE", |
|
|
|
"M_(E|LOG(2|10)E|LN2|LN10|PI|PI_2|PI_4|1_PI|2_PI|2_SQRTPI|SQRT(2|1_2))", |
|
|
|
"M_(E|LOG(2|10)E|LN2|LN10|PI|PI_[24]|[12]_PI|2_SQRTPI|SQRT(2|1_2))", |
|
|
|
"SIG(HUP|INT|QUIT|ILL|TRAP|ABRT|FPE|KILL|USR1|SEGV|USR2|PIPE|ALRM)", |
|
|
|
"SIG(TERM|CHLD|CONT|STOP|TSTP|TTIN|TTOU)" |
|
|
|
}; |
|
|
|
|
|
|
|
private static string[] m_lol_constants = |
|
|
|
{ |
|
|
|
"(F|D|LD)_(PI|PI_[234]|[12]_PI|SQRT(2|3|1_2))", |
|
|
|
}; |
|
|
|
|
|
|
|
private static string[] m_csharp_constants = |
|
|
|
{ |
|
|
|
"null", |
|
|
@@ -136,10 +164,12 @@ class CppKeywordClassifier : IClassifier |
|
|
|
|
|
|
|
internal CppKeywordClassifier(IClassificationTypeRegistryService registry, |
|
|
|
IClassifier classifier, |
|
|
|
IContentType type) |
|
|
|
IContentType type, |
|
|
|
bool islolengine) |
|
|
|
{ |
|
|
|
m_classifier = classifier; |
|
|
|
m_inprogress = false; |
|
|
|
m_islolengine = islolengine; |
|
|
|
|
|
|
|
m_types_type = registry.GetClassificationType("LolAnyType"); |
|
|
|
m_normal_type = registry.GetClassificationType("LolAnyIdentifier"); |
|
|
@@ -168,6 +198,12 @@ class CppKeywordClassifier : IClassifier |
|
|
|
constants_list = constants_list.Concat(m_lolfx_constants).ToList(); |
|
|
|
} |
|
|
|
|
|
|
|
if (m_islolengine) |
|
|
|
{ |
|
|
|
types_list = types_list.Concat(m_lol_types).ToList(); |
|
|
|
constants_list = constants_list.Concat(m_lol_constants).ToList(); |
|
|
|
} |
|
|
|
|
|
|
|
m_types_regex = |
|
|
|
new Regex("^(" + String.Join("|", types_list.ToArray()) + ")$"); |
|
|
|
m_constant_regex = |
|
|
|