From 0972d09837a009203568e9563a03466c276aaf95 Mon Sep 17 00:00:00 2001 From: AlexanderZemlyak <92867056+AlexanderZemlyak@users.noreply.github.com> Date: Sat, 28 Jun 2025 16:10:29 +0300 Subject: [PATCH] =?UTF-8?q?Return=20break,=20continue=20=D0=B8=20exit=20in?= =?UTF-8?q?=20completion=20list=20(#3298)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CodeCompletion/CodeCompletion.cs | 2 +- .../ParserTools/BaseLanguageInformation.cs | 4 +- .../ParserTools/Keywords/BaseKeywords.cs | 40 ++++++++++++++----- .../PascalABCParserNewSaushkin/Keywords.cs | 5 +++ .../PascalABCLanguageInformation.cs | 9 +---- 5 files changed, 39 insertions(+), 21 deletions(-) diff --git a/CodeCompletion/CodeCompletion.cs b/CodeCompletion/CodeCompletion.cs index a6af36f9e..990485154 100644 --- a/CodeCompletion/CodeCompletion.cs +++ b/CodeCompletion/CodeCompletion.cs @@ -389,7 +389,7 @@ namespace CodeCompletion public List GetKeywords() { if (CodeCompletionController.CurrentParser != null) - return CodeCompletionController.CurrentParser.LanguageInformation.KeywordsStorage.Keywords; + return CodeCompletionController.CurrentParser.LanguageInformation.KeywordsStorage.KeywordsForIntellisenseList; return new List(); } diff --git a/ParserTools/ParserTools/BaseLanguageInformation.cs b/ParserTools/ParserTools/BaseLanguageInformation.cs index 945b46cc4..6e5dea24c 100644 --- a/ParserTools/ParserTools/BaseLanguageInformation.cs +++ b/ParserTools/ParserTools/BaseLanguageInformation.cs @@ -754,9 +754,9 @@ namespace PascalABCCompiler.Parsers public abstract bool IsDefinitionIdentifierAfterKeyword(KeywordKind keyw); - public virtual bool IsKeyword(string value) + public bool IsKeyword(string value) { - return KeywordsStorage.KeywordsToTokens.ContainsKey(value); + return KeywordsStorage.KeywordsForIntellisenseSet.Contains(value); } public abstract bool IsMethodCallParameterSeparator(char key); diff --git a/ParserTools/ParserTools/Keywords/BaseKeywords.cs b/ParserTools/ParserTools/Keywords/BaseKeywords.cs index 001d383c4..b209872bf 100644 --- a/ParserTools/ParserTools/Keywords/BaseKeywords.cs +++ b/ParserTools/ParserTools/Keywords/BaseKeywords.cs @@ -10,14 +10,28 @@ namespace PascalABCCompiler.Parsers public abstract class BaseKeywords { /// - /// Соотвествие ключевых слов токенам + /// Соотвествие ключевых слов токенам (ключевые слова для парсера) /// public Dictionary KeywordsToTokens { get; set; } + /// + /// Типы ключевых слов + /// public Dictionary KeywordKinds { get; set; } - public List Keywords { get; set; } = new List(); + /// + /// Ключевые слова в контексте Intellisense (множество) + /// + public HashSet KeywordsForIntellisenseSet { get; } + /// + /// Ключевые слова в контексте Intellisense (список) + /// + public List KeywordsForIntellisenseList { get; set; } = new List(); + + /// + /// Ключевые слова, соответствующие типам (array, set), либо классу, функции + /// public List TypeKeywords { get; set; } = new List(); /// @@ -42,7 +56,7 @@ namespace PascalABCCompiler.Parsers if (System.IO.File.Exists(pathToKeymapFile)) keymap = System.IO.File.ReadLines(pathToKeymapFile, Encoding.Unicode).Select(s => s.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)).ToDictionary(w => w[0], w => w[1]); } - catch (Exception e) + catch (Exception) { //var w = e.Message; } @@ -63,9 +77,13 @@ namespace PascalABCCompiler.Parsers { ReloadKeyMap(); - KeywordsToTokens = new Dictionary(caseSensitive ? StringComparer.CurrentCulture : StringComparer.CurrentCultureIgnoreCase); + StringComparer stringComparer = caseSensitive ? StringComparer.Ordinal : StringComparer.OrdinalIgnoreCase; - KeywordKinds = new Dictionary(caseSensitive ? StringComparer.CurrentCulture : StringComparer.CurrentCultureIgnoreCase); + KeywordsToTokens = new Dictionary(stringComparer); + + KeywordsForIntellisenseSet = new HashSet(stringComparer); + + KeywordKinds = new Dictionary(stringComparer); } /// @@ -84,20 +102,22 @@ namespace PascalABCCompiler.Parsers return GetIdToken(); } - public void CreateNewKeyword(string name, Enum token, KeywordKind kind = KeywordKind.None, bool isTypeKeyword = false) + public void CreateNewKeyword(string name, Enum token = null, KeywordKind kind = KeywordKind.None, bool isTypeKeyword = false) { name = ConvertKeyword(name); if (kind != KeywordKind.None) KeywordKinds[name] = kind; - Keywords.Add(name); - KeywordsToTokens[name] = (int)(object)token; + KeywordsForIntellisenseList.Add(name); + KeywordsForIntellisenseSet.Add(name); + + // token null может передаваться, если это ключевое слово исключительно для Intellisense (например, break) + if (token != null) + KeywordsToTokens[name] = (int)(object)token; if (isTypeKeyword) TypeKeywords.Add(name); - - // return new Keyword(name, token, kind, isTypeKeyword); } } } diff --git a/Parsers/PascalABCParserNewSaushkin/Keywords.cs b/Parsers/PascalABCParserNewSaushkin/Keywords.cs index 18c8c11a1..39f644c03 100644 --- a/Parsers/PascalABCParserNewSaushkin/Keywords.cs +++ b/Parsers/PascalABCParserNewSaushkin/Keywords.cs @@ -114,6 +114,11 @@ namespace Languages.Pascal.Frontend.Core CreateNewKeyword("index", Tokens.tkIndex); CreateNewKeyword("async", Tokens.tkAsync); CreateNewKeyword("await", Tokens.tkAwait); + + // В парсере это не ключевые слова + CreateNewKeyword("break"); + CreateNewKeyword("exit"); + CreateNewKeyword("continue"); #endregion } diff --git a/PascalABCLanguageInfo/PascalABCLanguageInformation.cs b/PascalABCLanguageInfo/PascalABCLanguageInformation.cs index cab596b1f..d8134be11 100644 --- a/PascalABCLanguageInfo/PascalABCLanguageInformation.cs +++ b/PascalABCLanguageInfo/PascalABCLanguageInformation.cs @@ -82,13 +82,6 @@ namespace Languages.Pascal.Frontend.Data #endregion } - public override bool IsKeyword(string value) - { - // typeof и sizeof воспринимаются Intellisense по другому EVA - return !value.Equals("typeof", StringComparison.CurrentCultureIgnoreCase) && !value.Equals("sizeof", StringComparison.CurrentCultureIgnoreCase) - && KeywordsStorage.KeywordsToTokens.ContainsKey(value); - } - public override string BodyStartBracket { get @@ -109,7 +102,7 @@ namespace Languages.Pascal.Frontend.Data { get { - return KeywordsStorage.Keywords; + return KeywordsStorage.KeywordsForIntellisenseList; } }