diff --git a/include/eepp/ui/doc/syntaxdefinition.hpp b/include/eepp/ui/doc/syntaxdefinition.hpp index 169cb83e3..3afd7434c 100644 --- a/include/eepp/ui/doc/syntaxdefinition.hpp +++ b/include/eepp/ui/doc/syntaxdefinition.hpp @@ -144,9 +144,9 @@ class EE_API SyntaxDefinition { SyntaxDefinition& setFoldRangeType( FoldRangeType foldRangeType ); - std::vector> getFoldBraces() const; + std::vector> getFoldBraces() const; - SyntaxDefinition& setFoldBraces( const std::vector>& foldBraces ); + SyntaxDefinition& setFoldBraces( const std::vector>& foldBraces ); protected: friend class SyntaxDefinitionManager; @@ -162,7 +162,7 @@ class EE_API SyntaxDefinition { std::string mLSPName; Uint16 mLanguageIndex{ 0 }; FoldRangeType mFoldRangeType{ FoldRangeType::Undefined }; - std::vector> mFoldBraces; + std::vector> mFoldBraces; bool mAutoCloseXMLTags{ false }; bool mVisible{ true }; bool mHasExtensionPriority{ false }; diff --git a/include/eepp/ui/uicodeeditor.hpp b/include/eepp/ui/uicodeeditor.hpp index 7a8f204d7..0d390673c 100644 --- a/include/eepp/ui/uicodeeditor.hpp +++ b/include/eepp/ui/uicodeeditor.hpp @@ -826,6 +826,7 @@ class EE_API UICodeEditor : public UIWidget, public TextDocument::Client { LineWrapType mLineWrapType{ LineWrapType::Viewport }; Drawable* mFoldDrawable{ nullptr }; Drawable* mFoldedDrawable{ nullptr }; + String::HashType mTagFoldRange{ 0 }; UICodeEditor( const std::string& elementTag, const bool& autoRegisterBaseCommands = true, const bool& autoRegisterBaseKeybindings = true ); @@ -1016,6 +1017,10 @@ class EE_API UICodeEditor : public UIWidget, public TextDocument::Client { size_t getTotalVisibleLines() const; void invalidateLineWrapMaxWidth( bool force ); + + void findRegionsDelayed(); + + void refreshTag(); }; }} // namespace EE::UI diff --git a/src/eepp/ui/doc/foldrangeservice.cpp b/src/eepp/ui/doc/foldrangeservice.cpp index ab0d8958a..3dad79375 100644 --- a/src/eepp/ui/doc/foldrangeservice.cpp +++ b/src/eepp/ui/doc/foldrangeservice.cpp @@ -1,28 +1,124 @@ +#include "eepp/ui/doc/syntaxhighlighter.hpp" +#include #include #include +#include + namespace EE { namespace UI { namespace Doc { +static std::vector findFoldingRangesBraces( TextDocument* doc ) { + Clock c; + std::stack braceStack; + std::vector regions; + const auto& braces = doc->getSyntaxDefinition().getFoldBraces(); + size_t linesCount = doc->linesCount(); + auto highlighter = doc->getHighlighter(); + for ( size_t lineIdx = 0; lineIdx < linesCount; lineIdx++ ) { + const auto& line = doc->line( lineIdx ).getText(); + size_t lineLength = line.length(); + for ( size_t colIdx = 0; colIdx < lineLength; colIdx++ ) { + for ( const auto& bracePair : braces ) { + String::StringBaseType curChar = line[colIdx]; + if ( curChar == bracePair.first ) { + auto textPosition = TextPosition( lineIdx, colIdx ); + auto tokenType = highlighter->getTokenTypeAt( textPosition ); + if ( tokenType != SyntaxStyleTypes::String && + tokenType != SyntaxStyleTypes::Comment ) { + braceStack.push( TextPosition( lineIdx, colIdx ) ); + } + } else if ( curChar == bracePair.second ) { + if ( !braceStack.empty() ) { + auto textPosition = TextPosition( lineIdx, colIdx ); + auto tokenType = highlighter->getTokenTypeAt( textPosition ); + if ( tokenType != SyntaxStyleTypes::String && + tokenType != SyntaxStyleTypes::Comment ) { + auto start = braceStack.top(); + braceStack.pop(); + if ( start.line() != static_cast( lineIdx ) ) + regions.emplace_back( start, TextPosition( lineIdx, colIdx ) ); + } + } + } + } + } + } + Log::debug( "findFoldingRangesBraces for \"%s\" took %s", doc->getFilePath(), + c.getElapsedTime().toString() ); + return regions; +} + +static int countLeadingSpaces( const String& line ) { + int count = 0; + for ( auto ch : line ) { + if ( ch != ' ' && ch != '\t' ) + break; + ++count; + } + return count; +} + +static std::vector findFoldingRangesIndentation( TextDocument* doc ) { + Clock c; + std::stack indentStack; + std::vector regions; + const auto& braces = doc->getSyntaxDefinition().getFoldBraces(); + size_t linesCount = doc->linesCount(); + int currentIndent = 0; + + for ( size_t lineIdx = 0; lineIdx < linesCount; lineIdx++ ) { + const auto& line = doc->line( lineIdx ).getText(); + int newIndent = countLeadingSpaces( line ); + if ( newIndent > currentIndent ) { + // Block starts at the previous line + indentStack.push( { static_cast( lineIdx - 1 ), 0 } ); + } else if ( newIndent < currentIndent && !indentStack.empty() ) { + while ( !indentStack.empty() && indentStack.top().column() >= newIndent ) { + auto top = indentStack.top(); + indentStack.pop(); + // End at the previous line + regions.emplace_back( TextPosition( top.line(), 0 ), + TextPosition( static_cast( lineIdx ) - 1, 0 ) ); + } + } + currentIndent = newIndent; + } + + // Close any remaining open blocks + while ( !indentStack.empty() ) { + auto top = indentStack.top(); + indentStack.pop(); + regions.emplace_back( TextPosition( top.line() + 1, 0 ), + TextPosition( static_cast( linesCount ) - 1, 0 ) ); + } + + Log::debug( "findFoldingRangesIndentation for \"%s\" took %s", doc->getFilePath(), + c.getElapsedTime().toString() ); + return regions; +} + FoldRangeServive::FoldRangeServive( TextDocument* doc ) : mDoc( doc ) {} bool FoldRangeServive::canFold() const { - if ( mProvider && mProvider( mDoc, false ) ) - return true; - // return mDoc->getSyntaxDefinition().getFoldRangeType() != FoldRangeType::Undefined; - return false; + // if ( mProvider && mProvider( mDoc, false ) ) + // return true; + auto type = mDoc->getSyntaxDefinition().getFoldRangeType(); + return type == FoldRangeType::Braces || type == FoldRangeType::Indentation; } void FoldRangeServive::findRegions() { - if ( mDoc == nullptr ) + if ( mDoc == nullptr || !canFold() ) return; - if ( mProvider && mProvider( mDoc, true ) ) - return; + // if ( mProvider && mProvider( mDoc, true ) ) + // return; switch ( mDoc->getSyntaxDefinition().getFoldRangeType() ) { case FoldRangeType::Braces: + setFoldingRegions( findFoldingRangesBraces( mDoc ) ); break; case FoldRangeType::Indentation: + setFoldingRegions( findFoldingRangesIndentation( mDoc ) ); case FoldRangeType::Tag: case FoldRangeType::Undefined: break; diff --git a/src/eepp/ui/doc/languages/adept.cpp b/src/eepp/ui/doc/languages/adept.cpp index 0390509cf..d778ecb2a 100644 --- a/src/eepp/ui/doc/languages/adept.cpp +++ b/src/eepp/ui/doc/languages/adept.cpp @@ -4,7 +4,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addAdept() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Adept", { "%.adept$" }, { @@ -124,6 +124,8 @@ void addAdept() { { "null", "literal" }, }, "//" } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/angelscript.cpp b/src/eepp/ui/doc/languages/angelscript.cpp index a6fdf3a77..c7b47a865 100644 --- a/src/eepp/ui/doc/languages/angelscript.cpp +++ b/src/eepp/ui/doc/languages/angelscript.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addAngelScript() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "AngelScript", { "%.as$", "%.asc$" }, @@ -55,6 +55,8 @@ void addAngelScript() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/buzz.cpp b/src/eepp/ui/doc/languages/buzz.cpp index 65cc7c758..bd4b7da3f 100644 --- a/src/eepp/ui/doc/languages/buzz.cpp +++ b/src/eepp/ui/doc/languages/buzz.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addBuzz() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Buzz", { "%.buzz$" }, @@ -48,6 +48,8 @@ void addBuzz() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/carbon.cpp b/src/eepp/ui/doc/languages/carbon.cpp index 7157fddd8..e04c3767a 100644 --- a/src/eepp/ui/doc/languages/carbon.cpp +++ b/src/eepp/ui/doc/languages/carbon.cpp @@ -6,7 +6,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addCarbon() { // Based in Lite-XL Rohan Vashisht implementation // https://github.com/RohanVashisht1234/carbon_syntax_highlighter_lite-xl - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Carbon", { "%.carbon$" }, @@ -54,6 +54,8 @@ void addCarbon() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/containerfile.cpp b/src/eepp/ui/doc/languages/containerfile.cpp index 89d7b3c9d..b32561ff5 100644 --- a/src/eepp/ui/doc/languages/containerfile.cpp +++ b/src/eepp/ui/doc/languages/containerfile.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addContainerFile() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Containerfile", { "^[Cc]ontainerfile$", "^[dD]ockerfile$", "%.[dD]ockerfile$" }, @@ -41,6 +41,8 @@ void addContainerFile() { "#", {}, "dockerfile" } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/csharp.cpp b/src/eepp/ui/doc/languages/csharp.cpp index b997984f3..dac9e8320 100644 --- a/src/eepp/ui/doc/languages/csharp.cpp +++ b/src/eepp/ui/doc/languages/csharp.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addCSharp() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "C#", { "%.cs$", "%.csx$" }, @@ -64,6 +64,8 @@ void addCSharp() { "//", {}, "csharp" } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/css.cpp b/src/eepp/ui/doc/languages/css.cpp index 4e8614135..aa4b92151 100644 --- a/src/eepp/ui/doc/languages/css.cpp +++ b/src/eepp/ui/doc/languages/css.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addCSS() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "CSS", { "%.css$" }, @@ -318,6 +318,8 @@ void addCSS() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/d.cpp b/src/eepp/ui/doc/languages/d.cpp index 5797a1312..bd86a8bbf 100644 --- a/src/eepp/ui/doc/languages/d.cpp +++ b/src/eepp/ui/doc/languages/d.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addD() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "D", { "%.d$", "%.di$" }, @@ -143,6 +143,8 @@ void addD() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/dart.cpp b/src/eepp/ui/doc/languages/dart.cpp index 327e0546c..09a9ec063 100644 --- a/src/eepp/ui/doc/languages/dart.cpp +++ b/src/eepp/ui/doc/languages/dart.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addDart() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Dart", { "%.dart$" }, @@ -47,6 +47,8 @@ void addDart() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/fantom.cpp b/src/eepp/ui/doc/languages/fantom.cpp index c9fd15ea8..07007de49 100644 --- a/src/eepp/ui/doc/languages/fantom.cpp +++ b/src/eepp/ui/doc/languages/fantom.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addFantom() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Fantom", { "%.fan$", "%.fanx$" }, @@ -114,6 +114,8 @@ void addFantom() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/fortran.cpp b/src/eepp/ui/doc/languages/fortran.cpp index 4be1b608c..9c8aff2d9 100644 --- a/src/eepp/ui/doc/languages/fortran.cpp +++ b/src/eepp/ui/doc/languages/fortran.cpp @@ -6,7 +6,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addFortran() { // Based in Lite-XL Rohan Vashisht implementation // https://github.com/RohanVashisht1234/fortran_syntax_highlighter_lite-xl - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Fortran", { "%.f$", "%.f90$", "%.f95$" }, @@ -52,6 +52,8 @@ void addFortran() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/gdscript.cpp b/src/eepp/ui/doc/languages/gdscript.cpp index c30828ee1..aac6f08f5 100644 --- a/src/eepp/ui/doc/languages/gdscript.cpp +++ b/src/eepp/ui/doc/languages/gdscript.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addGDScript() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "GDScript", { "%.gd$" }, @@ -102,6 +102,8 @@ void addGDScript() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/glsl.cpp b/src/eepp/ui/doc/languages/glsl.cpp index 48ae9c3e6..6dd7c0537 100644 --- a/src/eepp/ui/doc/languages/glsl.cpp +++ b/src/eepp/ui/doc/languages/glsl.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addGLSL() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "GLSL", { "%.glsl$", "%.frag$", "%.vert$", "%.fs$", "%.vs$", "%.tesc", "%.tese" }, @@ -368,6 +368,8 @@ void addGLSL() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/go.cpp b/src/eepp/ui/doc/languages/go.cpp index bf8b7f2d5..fb4e3c797 100644 --- a/src/eepp/ui/doc/languages/go.cpp +++ b/src/eepp/ui/doc/languages/go.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addGo() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Go", { "%.go$" }, @@ -56,6 +56,8 @@ void addGo() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/groovy.cpp b/src/eepp/ui/doc/languages/groovy.cpp index 1e86c7129..0c975dfe9 100644 --- a/src/eepp/ui/doc/languages/groovy.cpp +++ b/src/eepp/ui/doc/languages/groovy.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addGroovy() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Groovy", { "%.groovy$" }, @@ -107,6 +107,8 @@ void addGroovy() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/hare.cpp b/src/eepp/ui/doc/languages/hare.cpp index b680a9f85..889f8491d 100644 --- a/src/eepp/ui/doc/languages/hare.cpp +++ b/src/eepp/ui/doc/languages/hare.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addHare() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Hare", { "%.ha$" }, @@ -64,6 +64,8 @@ void addHare() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/hlsl.cpp b/src/eepp/ui/doc/languages/hlsl.cpp index 340edee04..f178757bd 100644 --- a/src/eepp/ui/doc/languages/hlsl.cpp +++ b/src/eepp/ui/doc/languages/hlsl.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addHLSL() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "HLSL", { @@ -264,6 +264,8 @@ void addHLSL() { { "trunc", "keyword" }, }, "//" } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/jai.cpp b/src/eepp/ui/doc/languages/jai.cpp index 9004de382..6e4d65c95 100644 --- a/src/eepp/ui/doc/languages/jai.cpp +++ b/src/eepp/ui/doc/languages/jai.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addJai() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Jai", { "%.jai$" }, @@ -59,6 +59,8 @@ void addJai() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/java.cpp b/src/eepp/ui/doc/languages/java.cpp index 26aaaf0bb..fec801bfd 100644 --- a/src/eepp/ui/doc/languages/java.cpp +++ b/src/eepp/ui/doc/languages/java.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addJava() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Java", { "%.java$", "%.bsh$" }, @@ -58,6 +58,8 @@ void addJava() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/json.cpp b/src/eepp/ui/doc/languages/json.cpp index 1e979f895..0e99f456e 100644 --- a/src/eepp/ui/doc/languages/json.cpp +++ b/src/eepp/ui/doc/languages/json.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addJSON() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "JSON", { "%.json$", "%.cson$", "%.webmanifest" }, @@ -30,6 +30,8 @@ void addJSON() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' }, { '[', ']' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/jsx.cpp b/src/eepp/ui/doc/languages/jsx.cpp index a93d96173..20d88b116 100644 --- a/src/eepp/ui/doc/languages/jsx.cpp +++ b/src/eepp/ui/doc/languages/jsx.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addJSX() { - SyntaxDefinitionManager::instance() + auto& sd = SyntaxDefinitionManager::instance() ->add( { "JSX", { "%.jsx$" }, { @@ -58,6 +58,7 @@ void addJSX() { .setAutoCloseXMLTags( true ) .setLSPName( "javascriptreact" ); + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/julia.cpp b/src/eepp/ui/doc/languages/julia.cpp index 33e90cf1c..9fb5d07fe 100644 --- a/src/eepp/ui/doc/languages/julia.cpp +++ b/src/eepp/ui/doc/languages/julia.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addJulia() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Julia", { "%.jl$" }, @@ -68,6 +68,8 @@ void addJulia() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/kotlin.cpp b/src/eepp/ui/doc/languages/kotlin.cpp index 94e5b50be..73d59f984 100644 --- a/src/eepp/ui/doc/languages/kotlin.cpp +++ b/src/eepp/ui/doc/languages/kotlin.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addKotlin() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Kotlin", { "%.kt$" }, @@ -70,6 +70,8 @@ void addKotlin() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/lobster.cpp b/src/eepp/ui/doc/languages/lobster.cpp index 5b504da1d..85ae69189 100644 --- a/src/eepp/ui/doc/languages/lobster.cpp +++ b/src/eepp/ui/doc/languages/lobster.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addLobster() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Lobster", { "%.lobster$" }, @@ -46,6 +46,8 @@ void addLobster() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/lua.cpp b/src/eepp/ui/doc/languages/lua.cpp index aa48e5f9a..e2f782472 100644 --- a/src/eepp/ui/doc/languages/lua.cpp +++ b/src/eepp/ui/doc/languages/lua.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addLua() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Lua", { "%.lua$" }, @@ -41,6 +41,8 @@ void addLua() { { "^#!.*[ /]lua" } } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/moonscript.cpp b/src/eepp/ui/doc/languages/moonscript.cpp index 85259c6b7..18e2e5130 100644 --- a/src/eepp/ui/doc/languages/moonscript.cpp +++ b/src/eepp/ui/doc/languages/moonscript.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addMoonscript() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "MoonScript", { "%.moon$" }, @@ -49,6 +49,8 @@ void addMoonscript() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/nelua.cpp b/src/eepp/ui/doc/languages/nelua.cpp index dd04dbe38..3874c44de 100644 --- a/src/eepp/ui/doc/languages/nelua.cpp +++ b/src/eepp/ui/doc/languages/nelua.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addNelua() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Nelua", { "%.nelua$" }, @@ -91,6 +91,8 @@ void addNelua() { { "^#!.*[ /]nelua" } } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/nim.cpp b/src/eepp/ui/doc/languages/nim.cpp index 030e85715..351ee0b6f 100644 --- a/src/eepp/ui/doc/languages/nim.cpp +++ b/src/eepp/ui/doc/languages/nim.cpp @@ -79,13 +79,15 @@ void addNim() { nim_patterns.insert( nim_patterns.end(), nim_user_patterns.begin(), nim_user_patterns.end() ); - SyntaxDefinitionManager::instance()->add( { + auto& sd = SyntaxDefinitionManager::instance()->add( { "Nim", { "%.nim$", "%.nims$", "%.nimble$" }, std::move( nim_patterns ), std::move( nim_symbols ), "#", } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/objeck.cpp b/src/eepp/ui/doc/languages/objeck.cpp index 1a1dffc2e..e188f9620 100644 --- a/src/eepp/ui/doc/languages/objeck.cpp +++ b/src/eepp/ui/doc/languages/objeck.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addObjeck() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Objeck", { "%.obs$" }, @@ -100,6 +100,8 @@ void addObjeck() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/objective-c.cpp b/src/eepp/ui/doc/languages/objective-c.cpp index d02c33e08..c25feaca3 100644 --- a/src/eepp/ui/doc/languages/objective-c.cpp +++ b/src/eepp/ui/doc/languages/objective-c.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addObjectiveC() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Objective-C", { "%.m$" }, @@ -44,6 +44,8 @@ void addObjectiveC() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/odin.cpp b/src/eepp/ui/doc/languages/odin.cpp index 325222c7a..d81e8a892 100644 --- a/src/eepp/ui/doc/languages/odin.cpp +++ b/src/eepp/ui/doc/languages/odin.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addOdin() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Odin", { "%.odin$" }, @@ -150,6 +150,8 @@ void addOdin() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/php.cpp b/src/eepp/ui/doc/languages/php.cpp index 94d70924c..8b6d89d92 100644 --- a/src/eepp/ui/doc/languages/php.cpp +++ b/src/eepp/ui/doc/languages/php.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addPHP() { - SyntaxDefinitionManager::instance() + auto& sd = SyntaxDefinitionManager::instance() ->add( { "PHP", { "%.php$", "%.php3$", "%.php4$", "%.php5$" }, { @@ -103,6 +103,8 @@ void addPHP() { {}, "php" } ) .setVisible( false ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/pony.cpp b/src/eepp/ui/doc/languages/pony.cpp index b7b975771..4d443da86 100644 --- a/src/eepp/ui/doc/languages/pony.cpp +++ b/src/eepp/ui/doc/languages/pony.cpp @@ -5,127 +5,129 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addPony() { -SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( -{"pony", -{ "%.pony$" }, -{ -{ { "//.-\n" }, "comment" }, -{ { "/%*", "%*/" }, "comment" }, -{ { "\"\"\"", "\"\"\"" }, "comment" }, -{ { "/%g", "/", "\\" }, "string" }, -{ { "\"", "\"", "\\" }, "string" }, -{ { "'.+'" }, "string" }, -{ { "`", "`", "\\" }, "string" }, -{ { "0x[%da-fA-F]+" }, "number" }, -{ { "0b[%da-fA-F]+" }, "number" }, -{ { "-?%d+[%d%_.eE]*" }, "number" }, -{ { "-?%.?[%d]+" }, "number" }, -{ { "^[0-9]{1,3}((_[0-9]{3})+)?$" }, "number" }, -{ { "[%+%-=/%*%^%%<>!~|&?]" }, "operator" }, -{ { "[%a_][%w_]*%f[(]" }, "function" }, -{ { "[%a_][%w_]*" }, "symbol" }, -{ { "%s+" }, "normal" }, -{ { "%w+%f[%s]" }, "normal" }, + { "pony", + { "%.pony$" }, + { + { { "//.-\n" }, "comment" }, + { { "/%*", "%*/" }, "comment" }, + { { "\"\"\"", "\"\"\"" }, "comment" }, + { { "/%g", "/", "\\" }, "string" }, + { { "\"", "\"", "\\" }, "string" }, + { { "'.+'" }, "string" }, + { { "`", "`", "\\" }, "string" }, + { { "0x[%da-fA-F]+" }, "number" }, + { { "0b[%da-fA-F]+" }, "number" }, + { { "-?%d+[%d%_.eE]*" }, "number" }, + { { "-?%.?[%d]+" }, "number" }, + { { "^[0-9]{1,3}((_[0-9]{3})+)?$" }, "number" }, + { { "[%+%-=/%*%^%%<>!~|&?]" }, "operator" }, + { { "[%a_][%w_]*%f[(]" }, "function" }, + { { "[%a_][%w_]*" }, "symbol" }, + { { "%s+" }, "normal" }, + { { "%w+%f[%s]" }, "normal" }, -}, -{ -{ "then" , "keyword" }, -{ "new" , "keyword" }, -{ "continue" , "keyword2" }, -{ "ifdef" , "keyword" }, -{ "&" , "keyword2" }, -{ "val" , "keyword" }, -{ "I32" , "keyword" }, -{ "this" , "keyword2" }, -{ "Pointer" , "keyword" }, -{ "consume" , "keyword2" }, -{ "Array" , "keyword" }, -{ "String" , "keyword" }, -{ "F64" , "keyword" }, -{ "xor" , "keyword2" }, -{ "end" , "keyword" }, -{ "addressof" , "keyword2" }, -{ "U128" , "keyword" }, -{ "object" , "keyword" }, -{ "match" , "keyword" }, -{ "with" , "keyword" }, -{ "false" , "keyword2" }, -{ "for" , "keyword" }, -{ "while" , "keyword" }, -{ "iso" , "keyword" }, -{ "Stringable" , "keyword" }, -{ "Iterator" , "keyword" }, -{ "else" , "keyword" }, -{ "recover" , "keyword2" }, -{ "compile_intrinsic" , "keyword" }, -{ "digestof" , "keyword2" }, -{ "actor" , "keyword" }, -{ "U32" , "keyword" }, -{ "primitive" , "keyword" }, -{ "iftype" , "keyword" }, -{ "struct" , "keyword" }, -{ "break" , "keyword2" }, -{ "is" , "keyword2" }, -{ "use" , "keyword" }, -{ "or" , "keyword2" }, -{ "until" , "keyword" }, -{ "if" , "keyword" }, -{ "let" , "keyword" }, -{ "isnt" , "keyword2" }, -{ "Any" , "keyword" }, -{ "elseif" , "keyword" }, -{ "in" , "keyword" }, -{ "USize" , "keyword" }, -{ "#alias" , "keyword2" }, -{ "Env" , "keyword" }, -{ "and" , "keyword2" }, -{ "trn" , "keyword" }, -{ "tag" , "keyword" }, -{ "box" , "keyword" }, -{ "None" , "keyword2" }, -{ "trait" , "keyword" }, -{ "return" , "keyword" }, -{ "var" , "keyword" }, -{ "U8" , "keyword" }, -{ "error" , "keyword2" }, -{ "try" , "keyword" }, -{ "as" , "keyword2" }, -{ "class" , "keyword" }, -{ "ILong" , "keyword" }, -{ "I8" , "keyword" }, -{ "repeat" , "keyword" }, -{ "U16" , "keyword" }, -{ "#send" , "keyword2" }, -{ "#any" , "keyword2" }, -{ "#share" , "keyword2" }, -{ "I128" , "keyword" }, -{ "#read" , "keyword2" }, -{ "F32" , "keyword" }, -{ "compile_error" , "keyword" }, -{ "embed" , "keyword" }, -{ "where" , "keyword2" }, -{ "true" , "keyword2" }, -{ "not" , "keyword2" }, -{ "Bool" , "keyword" }, -{ "|" , "keyword2" }, -{ "I64" , "keyword" }, -{ "U64" , "keyword" }, -{ "ULong" , "keyword" }, -{ "I16" , "keyword" }, -{ "interface" , "keyword" }, -{ "be" , "keyword" }, -{ "do" , "keyword" }, -{ "fun" , "keyword" }, -{ "ref" , "keyword" }, -{ "ISize" , "keyword" }, -{ "type" , "keyword" }, + }, + { + { "then", "keyword" }, + { "new", "keyword" }, + { "continue", "keyword2" }, + { "ifdef", "keyword" }, + { "&", "keyword2" }, + { "val", "keyword" }, + { "I32", "keyword" }, + { "this", "keyword2" }, + { "Pointer", "keyword" }, + { "consume", "keyword2" }, + { "Array", "keyword" }, + { "String", "keyword" }, + { "F64", "keyword" }, + { "xor", "keyword2" }, + { "end", "keyword" }, + { "addressof", "keyword2" }, + { "U128", "keyword" }, + { "object", "keyword" }, + { "match", "keyword" }, + { "with", "keyword" }, + { "false", "keyword2" }, + { "for", "keyword" }, + { "while", "keyword" }, + { "iso", "keyword" }, + { "Stringable", "keyword" }, + { "Iterator", "keyword" }, + { "else", "keyword" }, + { "recover", "keyword2" }, + { "compile_intrinsic", "keyword" }, + { "digestof", "keyword2" }, + { "actor", "keyword" }, + { "U32", "keyword" }, + { "primitive", "keyword" }, + { "iftype", "keyword" }, + { "struct", "keyword" }, + { "break", "keyword2" }, + { "is", "keyword2" }, + { "use", "keyword" }, + { "or", "keyword2" }, + { "until", "keyword" }, + { "if", "keyword" }, + { "let", "keyword" }, + { "isnt", "keyword2" }, + { "Any", "keyword" }, + { "elseif", "keyword" }, + { "in", "keyword" }, + { "USize", "keyword" }, + { "#alias", "keyword2" }, + { "Env", "keyword" }, + { "and", "keyword2" }, + { "trn", "keyword" }, + { "tag", "keyword" }, + { "box", "keyword" }, + { "None", "keyword2" }, + { "trait", "keyword" }, + { "return", "keyword" }, + { "var", "keyword" }, + { "U8", "keyword" }, + { "error", "keyword2" }, + { "try", "keyword" }, + { "as", "keyword2" }, + { "class", "keyword" }, + { "ILong", "keyword" }, + { "I8", "keyword" }, + { "repeat", "keyword" }, + { "U16", "keyword" }, + { "#send", "keyword2" }, + { "#any", "keyword2" }, + { "#share", "keyword2" }, + { "I128", "keyword" }, + { "#read", "keyword2" }, + { "F32", "keyword" }, + { "compile_error", "keyword" }, + { "embed", "keyword" }, + { "where", "keyword2" }, + { "true", "keyword2" }, + { "not", "keyword2" }, + { "Bool", "keyword" }, + { "|", "keyword2" }, + { "I64", "keyword" }, + { "U64", "keyword" }, + { "ULong", "keyword" }, + { "I16", "keyword" }, + { "interface", "keyword" }, + { "be", "keyword" }, + { "do", "keyword" }, + { "fun", "keyword" }, + { "ref", "keyword" }, + { "ISize", "keyword" }, + { "type", "keyword" }, -}, -"//", -{} + }, + "//", + {} -}); + } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/python.cpp b/src/eepp/ui/doc/languages/python.cpp index c5b5affad..d18e3d34d 100644 --- a/src/eepp/ui/doc/languages/python.cpp +++ b/src/eepp/ui/doc/languages/python.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addPython() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Python", { "%.py$", "%.pyw$", "%.bry$" }, @@ -41,6 +41,8 @@ void addPython() { { "^#!.*[ /]python", "^#!.*[ /]python3" } } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/ruby.cpp b/src/eepp/ui/doc/languages/ruby.cpp index 717f1368a..b76f104a5 100644 --- a/src/eepp/ui/doc/languages/ruby.cpp +++ b/src/eepp/ui/doc/languages/ruby.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addRuby() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Ruby", { "%.rb", "%.gemspec", "%.ruby" }, @@ -78,6 +78,8 @@ void addRuby() { { "^#!.*[ /]ruby" } } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/rust.cpp b/src/eepp/ui/doc/languages/rust.cpp index a5e37ea71..5a599b66c 100644 --- a/src/eepp/ui/doc/languages/rust.cpp +++ b/src/eepp/ui/doc/languages/rust.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addRust() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Rust", { "%.rs$" }, @@ -56,6 +56,8 @@ void addRust() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/solidity.cpp b/src/eepp/ui/doc/languages/solidity.cpp index caa74ecca..05bbb2f93 100644 --- a/src/eepp/ui/doc/languages/solidity.cpp +++ b/src/eepp/ui/doc/languages/solidity.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addSolidity() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Solidity", { "%.sol$" }, @@ -148,6 +148,8 @@ void addSolidity() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/swift.cpp b/src/eepp/ui/doc/languages/swift.cpp index 1841d9309..bd1dcdfe9 100644 --- a/src/eepp/ui/doc/languages/swift.cpp +++ b/src/eepp/ui/doc/languages/swift.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addSwift() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Swift", { "%.swift$" }, @@ -225,6 +225,8 @@ void addSwift() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/teal.cpp b/src/eepp/ui/doc/languages/teal.cpp index d1ba574ef..36bc66fa3 100644 --- a/src/eepp/ui/doc/languages/teal.cpp +++ b/src/eepp/ui/doc/languages/teal.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addTeal() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Teal", { "%.tl$", "%.d.tl$" }, @@ -44,6 +44,8 @@ void addTeal() { { "^#!.*[ /]tl" } } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/toml.cpp b/src/eepp/ui/doc/languages/toml.cpp index 0a7fe2aa2..5cf47d341 100644 --- a/src/eepp/ui/doc/languages/toml.cpp +++ b/src/eepp/ui/doc/languages/toml.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addToml() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "TOML", { "%.toml$" }, @@ -41,6 +41,8 @@ void addToml() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/v.cpp b/src/eepp/ui/doc/languages/v.cpp index 5853fdbd7..2bcb1b074 100644 --- a/src/eepp/ui/doc/languages/v.cpp +++ b/src/eepp/ui/doc/languages/v.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addV() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "V", { "%.v$", "%.vsh$" }, @@ -60,6 +60,8 @@ void addV() { {} } ).setExtensionPriority( true ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/vala.cpp b/src/eepp/ui/doc/languages/vala.cpp index 54c474bed..880d54c5f 100644 --- a/src/eepp/ui/doc/languages/vala.cpp +++ b/src/eepp/ui/doc/languages/vala.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addVala() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Vala", { "%.vala$", "%.genie$" }, @@ -71,6 +71,8 @@ void addVala() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/wren.cpp b/src/eepp/ui/doc/languages/wren.cpp index 17479829f..c8ac34674 100644 --- a/src/eepp/ui/doc/languages/wren.cpp +++ b/src/eepp/ui/doc/languages/wren.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addWren() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Wren", { "%.wren$" }, @@ -36,6 +36,8 @@ void addWren() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/yaml.cpp b/src/eepp/ui/doc/languages/yaml.cpp index 4d1370f38..c05b3fea1 100644 --- a/src/eepp/ui/doc/languages/yaml.cpp +++ b/src/eepp/ui/doc/languages/yaml.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addYAML() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "YAML", { "%.yml$", "%.yaml$" }, @@ -47,6 +47,8 @@ void addYAML() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Indentation ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/languages/zig.cpp b/src/eepp/ui/doc/languages/zig.cpp index b716e185b..1b24b1f41 100644 --- a/src/eepp/ui/doc/languages/zig.cpp +++ b/src/eepp/ui/doc/languages/zig.cpp @@ -5,7 +5,7 @@ namespace EE { namespace UI { namespace Doc { namespace Language { void addZig() { - SyntaxDefinitionManager::instance()->add( + auto& sd = SyntaxDefinitionManager::instance()->add( { "Zig", { "%.zig$" }, @@ -120,6 +120,8 @@ void addZig() { {} } ); + + sd.setFoldRangeType( FoldRangeType::Braces ).setFoldBraces( { { '{', '}' } } ); } }}}} // namespace EE::UI::Doc::Language diff --git a/src/eepp/ui/doc/syntaxdefinition.cpp b/src/eepp/ui/doc/syntaxdefinition.cpp index 1507cf65b..82cee73c1 100644 --- a/src/eepp/ui/doc/syntaxdefinition.cpp +++ b/src/eepp/ui/doc/syntaxdefinition.cpp @@ -102,12 +102,12 @@ SyntaxDefinition& SyntaxDefinition::setFoldRangeType( FoldRangeType foldRangeTyp return *this; } -std::vector> SyntaxDefinition::getFoldBraces() const { +std::vector> SyntaxDefinition::getFoldBraces() const { return mFoldBraces; } SyntaxDefinition& -SyntaxDefinition::setFoldBraces( const std::vector>& foldBraces ) { +SyntaxDefinition::setFoldBraces( const std::vector>& foldBraces ) { mFoldBraces = foldBraces; return *this; } diff --git a/src/eepp/ui/uicodeeditor.cpp b/src/eepp/ui/uicodeeditor.cpp index 7339efefb..64df6bcc3 100644 --- a/src/eepp/ui/uicodeeditor.cpp +++ b/src/eepp/ui/uicodeeditor.cpp @@ -133,6 +133,7 @@ UICodeEditor::UICodeEditor( const std::string& elementTag, const bool& autoRegis mFlags |= UI_TAB_STOP | UI_OWNS_CHILDS_POSITION | UI_SCROLLABLE; setTextSelection( true ); setColorScheme( SyntaxColorScheme::getDefault() ); + refreshTag(); mVScrollBar = UIScrollBar::NewVertical(); mVScrollBar->setParent( this ); mVScrollBar->addEventListener( Event::OnSizeChange, @@ -621,6 +622,8 @@ void UICodeEditor::onDocumentReloaded( TextDocument* ) { invalidateDraw(); invalidateLongestLineWidth(); invalidateLineWrapMaxWidth( true ); + refreshTag(); + findRegionsDelayed(); } void UICodeEditor::onDocumentLoaded() { @@ -630,6 +633,8 @@ void UICodeEditor::onDocumentLoaded() { invalidateDraw(); invalidateLongestLineWidth(); invalidateLineWrapMaxWidth( true ); + refreshTag(); + findRegionsDelayed(); } void UICodeEditor::onDocumentReset( TextDocument* ) { @@ -640,6 +645,8 @@ void UICodeEditor::onDocumentReset( TextDocument* ) { invalidateDraw(); invalidateLongestLineWidth(); invalidateLineWrapMaxWidth( true ); + refreshTag(); + findRegionsDelayed(); } void UICodeEditor::onDocumentChanged() { @@ -1915,6 +1922,8 @@ void UICodeEditor::onDocumentTextChanged( const DocumentContentChange& change ) } else { invalidateLongestLineWidth(); } + + findRegionsDelayed(); } void UICodeEditor::onDocumentCursorChange( const Doc::TextPosition& ) { @@ -1964,6 +1973,7 @@ void UICodeEditor::onDocumentSaved( TextDocument* doc ) { void UICodeEditor::onDocumentMoved( TextDocument* doc ) { DocEvent event( this, doc, Event::OnDocumentMoved ); sendEvent( &event ); + refreshTag(); } void UICodeEditor::onDocumentClosed( TextDocument* doc ) { @@ -4750,4 +4760,19 @@ bool UICodeEditor::stopMinimapDragging( const Vector2f& mousePos ) { return false; } +void UICodeEditor::findRegionsDelayed() { + if ( !mDoc->getFoldRangeService().canFold() ) + return; + UISceneNode* sceneNode = getUISceneNode(); + if ( sceneNode ) { + sceneNode->removeActionsByTag( mTagFoldRange ); + sceneNode->runOnMainThread( [this]() { mDoc->getFoldRangeService().findRegions(); }, + Seconds( 1.f ), mTagFoldRange ); + } +} + +void UICodeEditor::refreshTag() { + mTagFoldRange = String::hash( mDoc->getURI().toString() + ":foldrange" ); +} + }} // namespace EE::UI diff --git a/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp b/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp index 07aa0616b..c82bb8b5f 100644 --- a/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp +++ b/src/tools/ecode/plugins/lsp/lspdocumentclient.cpp @@ -18,13 +18,13 @@ LSPDocumentClient::LSPDocumentClient( LSPClientServer* server, TextDocument* doc notifyOpen(); requestSymbolsDelayed(); requestSemanticHighlightingDelayed(); - requestFoldRangeDelayed(); doc->getFoldRangeService().setProvider( [this]( auto, bool requestFolds ) -> bool { bool ret = mServer->getCapabilities().foldingRangeProvider; if ( ret && requestFolds ) - requestFoldRangeDelayed(); + requestFoldRange(); return ret; } ); + mDoc->getFoldRangeService().findRegions(); } LSPDocumentClient::~LSPDocumentClient() { @@ -45,7 +45,6 @@ LSPDocumentClient::~LSPDocumentClient() { void LSPDocumentClient::onDocumentLoaded( TextDocument* ) { refreshTag(); requestSemanticHighlightingDelayed(); - requestFoldRangeDelayed(); // requestCodeLens(); } @@ -57,7 +56,6 @@ void LSPDocumentClient::onDocumentTextChanged( const DocumentContentChange& chan mServer->getThreadPool()->run( [this, change]() { mServer->processDidChangeQueue(); } ); requestSymbolsDelayed(); requestSemanticHighlightingDelayed(); - requestFoldRangeDelayed(); } void LSPDocumentClient::onDocumentUndoRedo( const TextDocument::UndoRedo& /*eventType*/ ) {} @@ -124,7 +122,7 @@ int LSPDocumentClient::getVersion() const { void LSPDocumentClient::onServerInitialized() { requestSymbols(); requestSemanticHighlighting(); - requestFoldRange(); + mDoc->getFoldRangeService().findRegions(); // requestCodeLens(); } @@ -402,12 +400,16 @@ void LSPDocumentClient::requestFoldRange() { if ( !server->getCapabilities().foldingRangeProvider ) return; URI uri = mDoc->getURI(); - auto handler = [uri, this]( const PluginIDType&, const std::vector& res ) { + TextDocument* doc = mDoc; + auto handler = [uri, server, doc]( const PluginIDType&, + const std::vector& res ) { + if ( !server->hasDocument( uri ) ) + return; std::vector regions; regions.reserve( res.size() ); for ( const auto& region : res ) regions.push_back( { { region.startLine, 0 }, { region.endLine, 0 } } ); - mDoc->getFoldRangeService().setFoldingRegions( regions ); + doc->getFoldRangeService().setFoldingRegions( regions ); }; if ( Engine::instance()->isMainThread() ) {