diff --git a/tools/vslol/CppKeywordClassifier.cs b/tools/vslol/CppKeywordClassifier.cs index 2bfefa71..9c06b2b8 100644 --- a/tools/vslol/CppKeywordClassifier.cs +++ b/tools/vslol/CppKeywordClassifier.cs @@ -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(delegate { return new CppKeywordClassifier(m_type_registry, m_aggregator.GetClassifier(buffer), buffer.ContentType); }); + return buffer.Properties.GetOrCreateSingletonProperty(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 =