diff --git a/src/eepp/ui/doc/syntaxdefinition.cpp b/src/eepp/ui/doc/syntaxdefinition.cpp index 87cb52ae6..5446192cf 100644 --- a/src/eepp/ui/doc/syntaxdefinition.cpp +++ b/src/eepp/ui/doc/syntaxdefinition.cpp @@ -496,6 +496,7 @@ const SyntaxPattern* SyntaxDefinition::getPatternFromState( const SyntaxStateTyp return &repo->second[state.state - 1]; } } + eeASSERT( false ); } return nullptr; } diff --git a/src/eepp/ui/doc/syntaxdefinitionmanager.cpp b/src/eepp/ui/doc/syntaxdefinitionmanager.cpp index d73f4d53a..a2ce6f3ee 100644 --- a/src/eepp/ui/doc/syntaxdefinitionmanager.cpp +++ b/src/eepp/ui/doc/syntaxdefinitionmanager.cpp @@ -39,7 +39,7 @@ class TextMateScopeMapper { { "constant.character.escape", "string" }, // Escapes within strings { "variable.parameter", "keyword3" }, // Function parameters { "variable.language", "literal" }, // Language constants like 'this', 'self', 'null'? - { "variable.identifier", "keyword2" }, + { "variable.identifier", "normal" }, { "storage.type", "keyword2" }, // Class, struct, int, bool etc. (declaration) { "entity.name.function", "function" }, // Function definition name { "entity.name.type", "keyword2" }, // Type name (class, struct, etc.) in definition @@ -372,7 +372,51 @@ static std::string funcName( std::string name ) { return name; } +static void patternToCPP( std::string& buf, const SyntaxPattern& pattern, + const SyntaxDefinition& def ) { + bool allowReduce = pattern.patterns.size() == 1 && pattern.typesNames.size() <= 1 && + pattern.endTypesNames.empty(); + bool setType = allowReduce && pattern.matchType != SyntaxPatternMatchType::LuaPattern; + bool addPatternType = pattern.matchType != SyntaxPatternMatchType::LuaPattern || + ( pattern.patterns.size() == 2 && pattern.patterns[0] == "include" ); + bool allowSkip = allowReduce; + buf += "{ " + join( pattern.patterns ) + ", " + + join( pattern.typesNames, true, allowReduce, setType ) + + join( pattern.endTypesNames, true, false, setType, allowSkip, true ) + + str( pattern.syntax, ", ", "", false ); + if ( addPatternType && pattern.syntax.empty() ) { + if ( pattern.matchType == SyntaxPatternMatchType::RegEx ) + buf += ", \"\", SyntaxPatternMatchType::RegEx"; + else if ( pattern.matchType == SyntaxPatternMatchType::Parser ) + buf += ", \"\", SyntaxPatternMatchType::Parser"; + else if ( pattern.matchType == SyntaxPatternMatchType::LuaPattern ) + buf += ", \"\", SyntaxPatternMatchType::LuaPattern"; + } else if ( addPatternType ) { + if ( pattern.matchType == SyntaxPatternMatchType::RegEx ) + buf += ", SyntaxPatternMatchType::RegEx"; + else if ( pattern.matchType == SyntaxPatternMatchType::Parser ) + buf += ", SyntaxPatternMatchType::Parser"; + else if ( pattern.matchType == SyntaxPatternMatchType::LuaPattern ) + buf += ", SyntaxPatternMatchType::LuaPattern"; + } + if ( pattern.hasContentScope() ) { + const auto& patterns = def.getRepository( pattern.contentScopeRepoHash ); + buf += "{\n"; + for ( const auto& ptrn : patterns ) + patternToCPP( buf, ptrn, def ); + buf += "\n}"; + } + buf += " },\n"; +} + std::pair SyntaxDefinitionManager::toCPP( const SyntaxDefinition& def ) { + const auto patternsToCPP = [&]( std::string& buf, const std::vector& patterns ) { + buf += "{\n"; + for ( const auto& pattern : patterns ) + patternToCPP( buf, pattern, def ); + buf += "\n}"; + }; + std::string lang( def.getLanguageNameForFileSystem() ); std::string func( funcName( lang ) ); std::string header = "#ifndef EE_UI_DOC_" + func + "\n#define EE_UI_DOC_" + func + @@ -392,28 +436,8 @@ namespace EE { namespace UI { namespace Doc { namespace Language { // file types buf += join( def.getFiles() ) + ",\n"; // patterns - buf += "{\n"; - for ( const auto& pattern : def.getPatterns() ) { - buf += "{ " + join( pattern.patterns ) + ", " + - join( pattern.typesNames, true, true, - pattern.matchType != SyntaxPatternMatchType::LuaPattern ) + - join( pattern.endTypesNames, true, true, - pattern.matchType != SyntaxPatternMatchType::LuaPattern, true, true ) + - str( pattern.syntax, ", ", "", false ); - if ( pattern.matchType != SyntaxPatternMatchType::LuaPattern && pattern.syntax.empty() ) { - if ( pattern.matchType == SyntaxPatternMatchType::RegEx ) - buf += ", \"\", SyntaxPatternMatchType::RegEx"; - else if ( pattern.matchType == SyntaxPatternMatchType::Parser ) - buf += ", \"\", SyntaxPatternMatchType::Parser"; - } else if ( pattern.matchType != SyntaxPatternMatchType::LuaPattern ) { - if ( pattern.matchType == SyntaxPatternMatchType::RegEx ) - buf += ", SyntaxPatternMatchType::RegEx"; - else if ( pattern.matchType == SyntaxPatternMatchType::Parser ) - buf += ", SyntaxPatternMatchType::Parser"; - } - buf += " },\n"; - } - buf += "\n},\n"; + patternsToCPP( buf, def.getPatterns() ); + buf += ",\n"; // symbols buf += "{\n"; for ( const auto& symbol : def.getSymbolNames() ) @@ -464,6 +488,18 @@ namespace EE { namespace UI { namespace Doc { namespace Language { buf += " } );"; } + for ( const auto& repo : def.getRepositories() ) { + std::string name = def.getRepositoryName( repo.first ); + if ( name.starts_with( "$CONTENT_" ) ) + continue; + buf += ".addRepository( \"" + name + "\",\n\t\t"; + patternsToCPP( buf, repo.second ); + buf += "\n)"; + } + + if ( !def.getRepositories().empty() ) + buf += ".compile()"; + buf += ";\n}\n"; buf += "\n}}}} // namespace EE::UI::Doc::Language\n"; return std::make_pair( std::move( header ), std::move( buf ) ); @@ -614,8 +650,8 @@ static SyntaxPattern parsePattern( const nlohmann::json& pattern ) { }; // Assume TextMate pattern - if ( pattern.contains( "name" ) || pattern.contains( "begin" ) || - pattern.contains( "match" ) ) { + if ( pattern.contains( "name" ) || pattern.contains( "contentName" ) || + pattern.contains( "begin" ) || pattern.contains( "match" ) ) { ctype = SyntaxPatternMatchType::RegEx; if ( pattern.contains( "beginCaptures" ) ) @@ -631,6 +667,11 @@ static SyntaxPattern parsePattern( const nlohmann::json& pattern ) { type.emplace_back( TextMateScopeMapper::scopeToType( pattern.value( "name", "" ) ) ); } + if ( type.empty() && pattern.contains( "contentName" ) ) { + type.emplace_back( + TextMateScopeMapper::scopeToType( pattern.value( "contentName", "" ) ) ); + } + if ( pattern.contains( "match" ) && pattern["match"].is_string() ) { ptrns.emplace_back( pattern.value( "match", "" ) ); } else if ( pattern.contains( "include" ) ) { @@ -649,13 +690,8 @@ static SyntaxPattern parsePattern( const nlohmann::json& pattern ) { pattern["patterns"].is_array() ) { const auto& patterns = pattern["patterns"]; if ( patterns.size() == 1 && patterns[0].is_object() ) { - if ( patterns[0].contains( "include" ) && - patterns[0].value( "include", "" ) == "$self" ) { - syntax = "$self"; - } else if ( patterns[0].contains( "name" ) && patterns[0].contains( "match" ) && - patterns[0] - .value( "name", "" ) - .starts_with( "constant.character.escape" ) ) { + if ( patterns[0].contains( "name" ) && patterns[0].contains( "match" ) && + patterns[0].value( "name", "" ).starts_with( "constant.character.escape" ) ) { ptrns.emplace_back( patterns[0].value( "match", "" ) ); } else { subPatterns.push_back( parsePattern( patterns[0] ) ); @@ -776,6 +812,9 @@ static SyntaxDefinition loadLanguage( const nlohmann::json& json ) { const auto& patterns = repository["patterns"]; for ( const auto& pattern : patterns ) ptrns.emplace_back( parsePattern( pattern ) ); + } else if ( repository.is_array() ) { + for ( const auto& pattern : repository ) + ptrns.emplace_back( parsePattern( pattern ) ); } def.addRepository( name, std::move( ptrns ) ); } @@ -893,6 +932,7 @@ bool SyntaxDefinitionManager::loadFromStream( IOStream& stream, if ( pos.has_value() ) { if ( addedLangs ) addedLangs->push_back( res.getLanguageName() ); + res.mLanguageIndex = *pos; mDefinitions[pos.value()] = std::move( res ); } else { if ( addedLangs ) @@ -909,6 +949,7 @@ bool SyntaxDefinitionManager::loadFromStream( IOStream& stream, if ( pos.has_value() ) { if ( addedLangs ) addedLangs->push_back( res.getLanguageName() ); + res.mLanguageIndex = *pos; mDefinitions[pos.value()] = std::move( res ); } else { if ( addedLangs ) diff --git a/src/eepp/ui/doc/syntaxhighlighter.cpp b/src/eepp/ui/doc/syntaxhighlighter.cpp index 9bd643ae4..263a39b6e 100644 --- a/src/eepp/ui/doc/syntaxhighlighter.cpp +++ b/src/eepp/ui/doc/syntaxhighlighter.cpp @@ -131,7 +131,7 @@ void SyntaxHighlighter::setMaxTokenizationLength( const Int64& maxTokenizationLe void SyntaxHighlighter::tokenizeAsync( std::shared_ptr pool, const std::function& onDone ) { -#ifndef EE_COMPILER_MSVC +#if !defined( EE_COMPILER_MSVC ) && defined( EE_DEBUG ) #warning SyntaxHighlighter::tokenizeAsync is disabled return; #endif diff --git a/src/eepp/ui/doc/syntaxtokenizer.cpp b/src/eepp/ui/doc/syntaxtokenizer.cpp index db1f4028a..ec10b5f65 100644 --- a/src/eepp/ui/doc/syntaxtokenizer.cpp +++ b/src/eepp/ui/doc/syntaxtokenizer.cpp @@ -159,11 +159,15 @@ SyntaxStateRestored SyntaxTokenizer::retrieveSyntaxState( const SyntaxDefinition if ( curPattern->hasSyntaxOrContentScope() ) { syntaxState.subsyntaxInfo = curPattern; auto langIndex = state.langStack[i]; - syntaxState.currentSyntax = - langIndex != 0 - ? &SyntaxDefinitionManager::instance()->getByLanguageIndex( langIndex ) - : &SyntaxDefinitionManager::instance()->getByLanguageName( - syntaxState.subsyntaxInfo->syntax ); + + if ( langIndex ) { + syntaxState.currentSyntax = + langIndex != 0 + ? &SyntaxDefinitionManager::instance()->getByLanguageIndex( langIndex ) + : &SyntaxDefinitionManager::instance()->getByLanguageName( + syntaxState.subsyntaxInfo->syntax ); + } + if ( curPattern->hasContentScope() ) { syntaxState.currentPatternIdx = state.state[i]; syntaxState.currentLevel = i; diff --git a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp index d8d0168a7..bcd52386c 100644 --- a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp @@ -699,7 +699,7 @@ void LSPClientPlugin::setTrimLogs( bool trimLogs ) { } bool LSPClientPlugin::editorExists( UICodeEditor* editor ) { - return mManager->getSplitter()->editorExists( editor ); + return mManager->getSplitter() && mManager->getSplitter()->editorExists( editor ); } void LSPClientPlugin::createListView( UICodeEditor* editor, const std::shared_ptr& model,