Differentiating between two different lines

SyntaxEditor for Windows Forms Forum

Posted 15 years ago by Tim Davis
Avatar
I'm trying to differentiate, for purposes of outlining, two sets of strings..

Meaning,

I have a child state called function state.

It starts folding on a line begining with function ie ^funtion
and stops folding on a line beginning with end; ie ^end;

My problem is when I need to do an external function prototype
ie. function blah(blah, blah);

It is trying to fold starting at that function, I need to somehow tell the FunctionStartNode to only fold on lines that begin with function and do not end with a ";".

I've tried everything from ^function$[^;] to looking ahead for [^;]...

How can I do this?

Comments (4)

Posted 15 years ago by Actipro Software Support - Cleveland, OH, USA
Avatar
Each outlining node gets a OutliningNodeParseData put in its ParseData property. It's a bit tricky but if you do some parsing, and get a reference to the outlining nodes that should not fold, you can set the OutliningNodeParseData.IndicatorVisible property to false. That should hide it.


Actipro Software Support

Posted 15 years ago by Tim Davis
Avatar
Turns out I made a mistake in the way I described it...

Both styles of functions (prototype or actual code) end with a ";"

ie..

function prototype();

and

function realfunction(String: Blah) : String;
begin
code
end;

So in this case it may or may not be easier, can I it fold only when it see's the next line begining with begin or var?
Posted 15 years ago by Tim Davis
Avatar
Ok, i've found a regex pattern that will work but then I have problems with the IdentifierToken. I have it set to start outlining on a function token where the next line contains the word begin as the first word. This works. I have it set to stop outlining on a line that begins with end;

The identifier token is not letting me match the endscope pattern, it's registering it before the outlining does.

This is the last roadblock before my software gets tunred over to the beta team this friday and I'm extremely excited to show of this control :)

Any hints?

<State Key="FunctionState">
        <Scopes>
            <Scope>
                <RegexPatternGroup Type="StartScope" Token="FunctionStartToken" PatternValue="^function" LookAhead=".*[\n\f\r]begin"/>
                <RegexPatternGroup Type="EndScope" Token="FunctionEndToken" Style="ReservedWordStyle" PatternValue="^end;[\n\f\r]" LookAhead="{NonWordMacro}" />
            </Scope>
        </Scopes>
        <PatternGroups>
            <ExplicitPatternGroup Token="PascalReservedWordToken" Style="ReservedWordStyle" LookAhead="{NonWordMacro}">
                <ExplicitPatterns>
                    keywords keywords
                </ExplicitPatterns>
            </ExplicitPatternGroup>
            <RegexPatternGroup Token="IdentifierToken" PatternValue="(_| {AlphaMacro})({WordMacro})*"/>
        </PatternGroups>
        <ChildStates>
            <ChildState Key="CodeCommentState"/>
        </ChildStates>
    </State>
Posted 15 years ago by Actipro Software Support - Cleveland, OH, USA
Avatar
Hmm... I'm not sure of the way to do this. The problem is that your end scope requires a beginning of line assertion. However end scopes are matched after everything else.

This is how the matching occurs in the lexical parser:
  1. Look for scope end in a parent language (if any)
  2. Look for child start scope start
  3. Match patterns in current state
  4. Look for scope end in current language
Putting it in a different language might work. It's a very tricky situation though.


Actipro Software Support

The latest build of this product (v2020.1 build 0400) was released 1 days ago, which was after the last post in this thread.

Add Comment

Please log in to a validated account to post comments.