RomanYankovsky / DelphiAST

Abstract syntax tree builder for Delphi
Mozilla Public License 2.0
271 stars 116 forks source link

Added support for inline variables and constants #271

Closed Wosi closed 5 years ago

Wosi commented 5 years ago

The upcoming Delphi 10.3 release will allow inline variables and constants. See http://blog.marcocantu.com/blog/2018-october-inline-variables-delphi.html

This PR adds support for the new feature. This file:

unit InlineVariables;

interface

implementation

procedure ShowSomeVars;
var
  ClassicVarI, ClassicVarJ: Integer;
begin
  var NotInitializedI, NotInitializedJ: Integer;

  var InitialiazedTypedI: Integer := 22;
  var InferredI := 22;

  const TypedConst: Integer = 50;
  const InferredConst = 20;

  for var TypedI: Integer := 1 to 10 do
  begin

  end;

  for var TypedItem: TItemType in Collection do
  begin

  end;

  for var InferredI := 1 to 10 do
  begin

  end;

  for var InferredItem in Collection do
  begin

  end;
end;

end.

Looks like this in AST:

<?xml version="1.0"?>
<UNIT line="1" col="1" name="InlineVariables">
  <INTERFACE begin_line="3" begin_col="1" end_line="5" end_col="1"/>
  <IMPLEMENTATION begin_line="5" begin_col="1" end_line="40" end_col="1">
    <METHOD begin_line="7" begin_col="1" end_line="40" end_col="1" name="ShowSomeVars" kind="procedure">
      <VARIABLES line="8" col="1">
        <VARIABLE line="9" col="3">
          <NAME line="9" col="3" value="ClassicVarI"/>
          <TYPE line="9" col="29" name="Integer"/>
        </VARIABLE>
        <VARIABLE line="9" col="16">
          <NAME line="9" col="16" value="ClassicVarJ"/>
          <TYPE line="9" col="29" name="Integer"/>
        </VARIABLE>
      </VARIABLES>
      <STATEMENTS begin_line="10" begin_col="1" end_line="38" end_col="4">
        <VARIABLES line="11" col="3">
          <VARIABLE line="11" col="7">
            <NAME line="11" col="7" value="NotInitializedI"/>
            <TYPE line="11" col="41" name="Integer"/>
          </VARIABLE>
          <VARIABLE line="11" col="24">
            <NAME line="11" col="24" value="NotInitializedJ"/>
            <TYPE line="11" col="41" name="Integer"/>
          </VARIABLE>
        </VARIABLES>
        <VARIABLES line="13" col="3">
          <VARIABLE line="13" col="7">
            <NAME line="13" col="7" value="InitialiazedTypedI"/>
            <TYPE line="13" col="27" name="Integer"/>
          </VARIABLE>
          <ASSIGN line="0" col="0">
            <EXPRESSION line="13" col="38">
              <LITERAL line="13" col="38" value="22" type="numeric"/>
            </EXPRESSION>
          </ASSIGN>
        </VARIABLES>
        <VARIABLES line="14" col="3">
          <VARIABLE line="14" col="7">
            <NAME line="14" col="7" value="InferredI"/>
          </VARIABLE>
          <ASSIGN line="0" col="0">
            <EXPRESSION line="14" col="20">
              <LITERAL line="14" col="20" value="22" type="numeric"/>
            </EXPRESSION>
          </ASSIGN>
        </VARIABLES>
        <CONSTANT line="16" col="9">
          <NAME line="16" col="9" value="TypedConst"/>
          <TYPE line="16" col="21" name="Integer"/>
          <VALUE line="16" col="31">
            <EXPRESSION line="16" col="31">
              <LITERAL line="16" col="31" value="50" type="numeric"/>
            </EXPRESSION>
          </VALUE>
        </CONSTANT>
        <CONSTANT line="17" col="9">
          <NAME line="17" col="9" value="InferredConst"/>
          <VALUE line="17" col="25">
            <EXPRESSION line="17" col="25">
              <LITERAL line="17" col="25" value="20" type="numeric"/>
            </EXPRESSION>
          </VALUE>
        </CONSTANT>
        <FOR line="19" col="3">
          <VARIABLES line="19" col="11">
            <NAME line="19" col="11" value="TypedI"/>
            <TYPE line="19" col="19" name="Integer"/>
          </VARIABLES>
          <FROM line="19" col="30">
            <EXPRESSION line="19" col="30">
              <LITERAL line="19" col="30" value="1" type="numeric"/>
            </EXPRESSION>
          </FROM>
          <TO line="19" col="32">
            <EXPRESSION line="19" col="35">
              <LITERAL line="19" col="35" value="10" type="numeric"/>
            </EXPRESSION>
          </TO>
          <STATEMENTS begin_line="20" begin_col="3" end_line="22" end_col="6"/>
        </FOR>
        <FOR line="24" col="3">
          <VARIABLES line="24" col="11">
            <NAME line="24" col="11" value="TypedItem"/>
            <TYPE line="24" col="22" name="TItemType"/>
          </VARIABLES>
          <IN line="24" col="32">
            <EXPRESSION line="24" col="35">
              <IDENTIFIER line="24" col="35" name="Collection"/>
            </EXPRESSION>
          </IN>
          <STATEMENTS begin_line="25" begin_col="3" end_line="27" end_col="6"/>
        </FOR>
        <FOR line="29" col="3">
          <VARIABLES line="29" col="11">
            <NAME line="29" col="11" value="InferredI"/>
          </VARIABLES>
          <FROM line="29" col="24">
            <EXPRESSION line="29" col="24">
              <LITERAL line="29" col="24" value="1" type="numeric"/>
            </EXPRESSION>
          </FROM>
          <TO line="29" col="26">
            <EXPRESSION line="29" col="29">
              <LITERAL line="29" col="29" value="10" type="numeric"/>
            </EXPRESSION>
          </TO>
          <STATEMENTS begin_line="30" begin_col="3" end_line="32" end_col="6"/>
        </FOR>
        <FOR line="34" col="3">
          <VARIABLES line="34" col="11">
            <NAME line="34" col="11" value="InferredItem"/>
          </VARIABLES>
          <IN line="34" col="24">
            <EXPRESSION line="34" col="27">
              <IDENTIFIER line="34" col="27" name="Collection"/>
            </EXPRESSION>
          </IN>
          <STATEMENTS begin_line="35" begin_col="3" end_line="37" end_col="6"/>
        </FOR>
      </STATEMENTS>
    </METHOD>
  </IMPLEMENTATION>
</UNIT>
RomanYankovsky commented 5 years ago

Omg, thanks. I was going to do this. You were much faster 👍