Skip to content

Commit

Permalink
[EXPERIMENTAL] Sh: extract variables in variable assignments
Browse files Browse the repository at this point in the history
Signed-off-by: Masatake YAMATO <[email protected]>
  • Loading branch information
masatake committed Nov 22, 2022
1 parent 816e0c8 commit e730033
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 3 deletions.
4 changes: 4 additions & 0 deletions Units/parser-sh.r/sh-comments.d/expected.tags
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,7 @@ afterpound1 input.sh /^foo="#"; afterpound1() {}$/;" f
afterpound2 input.sh /^foo="#\\""; afterpound2() {}$/;" f
afterpound3 input.sh /^foo='#'; afterpound3() {}$/;" f
afterpound4 input.sh /^foo='#'''; afterpound4() {}$/;" f
foo input.sh /^foo="#"; afterpound1() {}$/;" v
foo input.sh /^foo="#\\""; afterpound2() {}$/;" v
foo input.sh /^foo='#'''; afterpound4() {}$/;" v
foo input.sh /^foo='#'; afterpound3() {}$/;" v
5 changes: 5 additions & 0 deletions Units/parser-sh.r/sh-quotes.d/expected.tags
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,8 @@ afterpound1 input.sh /^foo="#"; afterpound1() {}$/;" f
afterpound2 input.sh /^foo="#\\""; afterpound2() {}$/;" f
afterpound3 input.sh /^foo='#'; afterpound3() {}$/;" f
afterpound4 input.sh /^foo='#'''; afterpound4() {}$/;" f
foo input.sh /^foo="#"; afterpound1() {}$/;" v
foo input.sh /^foo="#\\""; afterpound2() {}$/;" v
foo input.sh /^foo="nofunction()"$/;" v
foo input.sh /^foo='#'''; afterpound4() {}$/;" v
foo input.sh /^foo='#'; afterpound3() {}$/;" v
40 changes: 37 additions & 3 deletions parsers/sh.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ typedef enum {
K_FUNCTION,
K_SCRIPT,
K_HEREDOCLABEL,
K_VARIABLE,
} shKind;

typedef enum {
Expand Down Expand Up @@ -86,8 +87,9 @@ static roleDefinition ZshFunctionRoles [] = {
.referenceOnly = false, FUNCTION_ROLES_SPEC }, \
{ true, 's', "script", "script files", \
.referenceOnly = true, ATTACH_ROLES (SCRIPT_ROLES) }, \
.referenceOnly = false, ATTACH_ROLES (HEREDOC_ROLES) }
{ true, 'h', "heredoc", "labels for here document", \
.referenceOnly = false, ATTACH_ROLES (HEREDOC_ROLES) }, \
{ true, 'v', "variable", "variables assigment (experimental)" }

static kindDefinition ShKinds [] = {
SH_KINDS_COMMON(ShScriptRoles, ShHeredocRoles,),
Expand Down Expand Up @@ -456,6 +458,34 @@ static size_t handleZshKeyword (int keyword,
return vStringLength(token);
}

static bool handleVariableAssignment (vString *input)
{
const char *base = vStringValue (input);
const char *cp = base;

while (*cp != '\0')
{
if (*cp == '=')
{
size_t len = cp - base;
/* Ignore VAR in if [[ \
VAR == ... ]] */
if (*(cp + 1) != '=' && len > 0)
{
vStringTruncate (input, len);
return true;
}
break;
}
else if ( ((cp == base)?
isIdentChar0: isIdentChar) ((unsigned char)*cp) )
cp++;
else
break;
}
return false;
}

typedef bool (* checkCharFunc) (int);
static void findShTagsCommon (size_t (* keyword_handler) (int,
vString *,
Expand Down Expand Up @@ -653,8 +683,9 @@ static void findShTagsCommon (size_t (* keyword_handler) (int,
while (isspace ((int) *cp))
++cp;

if ((found_kind != K_SCRIPT)
&& *cp == '(')
if (found_kind == K_SCRIPT)
; /* Do NOTHING */
else if (*cp == '(')
{
++cp;
while (isspace ((int) *cp))
Expand All @@ -680,6 +711,9 @@ static void findShTagsCommon (size_t (* keyword_handler) (int,
++cp;
}
}
else if (found_kind == K_NOTHING
&& handleVariableAssignment (name))
found_kind = K_VARIABLE;

if (found_kind != K_NOTHING)
{
Expand Down

0 comments on commit e730033

Please sign in to comment.