mirror of
https://github.com/github/semantic.git
synced 2024-12-21 05:41:54 +03:00
Merge pull request #1237 from github/fix-some-python-assignment-errors
Fix some python assignment errors
This commit is contained in:
commit
7b9099f6c2
@ -108,6 +108,9 @@ declaration = classDefinition
|
|||||||
<|> statement
|
<|> statement
|
||||||
<|> parseError
|
<|> parseError
|
||||||
|
|
||||||
|
declarations :: Assignment
|
||||||
|
declarations = makeTerm <$> location <*> many declaration
|
||||||
|
|
||||||
statement :: Assignment
|
statement :: Assignment
|
||||||
statement = assertStatement
|
statement = assertStatement
|
||||||
<|> assignment'
|
<|> assignment'
|
||||||
@ -133,6 +136,9 @@ statement = assertStatement
|
|||||||
<|> withStatement
|
<|> withStatement
|
||||||
<|> parseError
|
<|> parseError
|
||||||
|
|
||||||
|
statements :: Assignment
|
||||||
|
statements = makeTerm <$> location <*> many statement
|
||||||
|
|
||||||
literal :: Assignment
|
literal :: Assignment
|
||||||
literal = boolean
|
literal = boolean
|
||||||
<|> concatenatedString
|
<|> concatenatedString
|
||||||
@ -146,7 +152,7 @@ literal = boolean
|
|||||||
<|> parseError
|
<|> parseError
|
||||||
|
|
||||||
expressionStatement :: Assignment
|
expressionStatement :: Assignment
|
||||||
expressionStatement = symbol ExpressionStatement *> children declaration
|
expressionStatement = makeTerm <$> symbol ExpressionStatement <*> children (some declaration)
|
||||||
|
|
||||||
expression :: Assignment
|
expression :: Assignment
|
||||||
expression = argument
|
expression = argument
|
||||||
@ -173,6 +179,9 @@ expression = argument
|
|||||||
<|> unaryOperator
|
<|> unaryOperator
|
||||||
<|> parseError
|
<|> parseError
|
||||||
|
|
||||||
|
expressions :: Assignment
|
||||||
|
expressions = makeTerm <$> location <*> many expression
|
||||||
|
|
||||||
argument :: Assignment
|
argument :: Assignment
|
||||||
argument = makeTerm <$> symbol ListSplatArgument <*> (Syntax.Identifier <$> source)
|
argument = makeTerm <$> symbol ListSplatArgument <*> (Syntax.Identifier <$> source)
|
||||||
<|> makeTerm <$> symbol DictionarySplatArgument <*> (Syntax.Identifier <$> source)
|
<|> makeTerm <$> symbol DictionarySplatArgument <*> (Syntax.Identifier <$> source)
|
||||||
@ -199,33 +208,33 @@ withStatement :: Assignment
|
|||||||
withStatement = makeTerm <$> symbol WithStatement <*> children (uncurry Statement.Let . swap <$> (symbol WithItem *> children ((,) <$> identifier <*> identifier)) <*> expression)
|
withStatement = makeTerm <$> symbol WithStatement <*> children (uncurry Statement.Let . swap <$> (symbol WithItem *> children ((,) <$> identifier <*> identifier)) <*> expression)
|
||||||
|
|
||||||
forStatement :: Assignment
|
forStatement :: Assignment
|
||||||
forStatement = symbol ForStatement >>= \ loc -> children (make loc <$> (makeTerm <$> symbol Variables <*> children (many expression)) <*> expressionList <*> (makeTerm <$> location <*> many expression) <*> (optional (makeTerm <$> symbol ElseClause <*> children (many declaration))))
|
forStatement = symbol ForStatement >>= \ loc -> children (make loc <$> (makeTerm <$> symbol Variables <*> children (many expression)) <*> expressionList <*> expressions <*> optional (makeTerm <$> symbol ElseClause <*> children (many declaration)))
|
||||||
where
|
where
|
||||||
make loc variables expressionList forBody forElseClause = case forElseClause of
|
make loc variables expressionList forBody forElseClause = case forElseClause of
|
||||||
Nothing -> makeTerm loc (Statement.ForEach variables expressionList forBody)
|
Nothing -> makeTerm loc (Statement.ForEach variables expressionList forBody)
|
||||||
Just a -> makeTerm loc (Statement.Else (makeTerm loc $ Statement.ForEach variables expressionList forBody) a)
|
Just a -> makeTerm loc (Statement.Else (makeTerm loc $ Statement.ForEach variables expressionList forBody) a)
|
||||||
|
|
||||||
whileStatement :: Assignment
|
whileStatement :: Assignment
|
||||||
whileStatement = symbol WhileStatement >>= \ loc -> children (make loc <$> expression <*> (makeTerm <$> location <*> many expression) <*> (optional (makeTerm <$> symbol ElseClause <*> children (many declaration))))
|
whileStatement = symbol WhileStatement >>= \ loc -> children (make loc <$> expression <*> expressions <*> optional (makeTerm <$> symbol ElseClause <*> children (many declaration)))
|
||||||
where
|
where
|
||||||
make loc whileCondition whileBody whileElseClause = case whileElseClause of
|
make loc whileCondition whileBody whileElseClause = case whileElseClause of
|
||||||
Nothing -> makeTerm loc (Statement.While whileCondition whileBody)
|
Nothing -> makeTerm loc (Statement.While whileCondition whileBody)
|
||||||
Just a -> makeTerm loc (Statement.Else (makeTerm loc $ Statement.While whileCondition whileBody) a)
|
Just a -> makeTerm loc (Statement.Else (makeTerm loc $ Statement.While whileCondition whileBody) a)
|
||||||
|
|
||||||
tryStatement :: Assignment
|
tryStatement :: Assignment
|
||||||
tryStatement = makeTerm <$> symbol TryStatement <*> children (Statement.Try <$> expression <*> (many (expression <|> elseClause)))
|
tryStatement = makeTerm <$> symbol TryStatement <*> children (Statement.Try <$> expression <*> many (expression <|> elseClause))
|
||||||
where elseClause = makeTerm <$> symbol ElseClause <*> children (Statement.Else <$> emptyTerm <*> (makeTerm <$> location <*> (many expression)))
|
where elseClause = makeTerm <$> symbol ElseClause <*> children (Statement.Else <$> emptyTerm <*> (makeTerm <$> location <*> many expression))
|
||||||
|
|
||||||
exceptClause :: Assignment
|
exceptClause :: Assignment
|
||||||
exceptClause = makeTerm <$> symbol ExceptClause <*> children
|
exceptClause = makeTerm <$> symbol ExceptClause <*> children
|
||||||
(Statement.Catch <$> ((makeTerm <$> location <*> (uncurry Statement.Let . swap <$> ((,) <$> identifier <* symbol AnonAs <*> identifier) <*> emptyTerm))
|
(Statement.Catch <$> ((makeTerm <$> location <*> (uncurry Statement.Let . swap <$> ((,) <$> identifier <* symbol AnonAs <*> identifier) <*> emptyTerm))
|
||||||
<|> (makeTerm <$> location <*> (many identifier)))
|
<|> makeTerm <$> location <*> many identifier)
|
||||||
<*> (makeTerm <$> location <*> (many expression)))
|
<*> expressions)
|
||||||
|
|
||||||
functionDefinition :: Assignment
|
functionDefinition :: Assignment
|
||||||
functionDefinition = (symbol FunctionDefinition >>= \ loc -> children (makeFunctionDeclaration loc <$> identifier <*> (symbol Parameters *> children (many expression)) <*> (optional (symbol Type *> children expression)) <*> (makeTerm <$> location <*> many declaration)))
|
functionDefinition = (symbol FunctionDefinition >>= \ loc -> children (makeFunctionDeclaration loc <$> identifier <*> (symbol Parameters *> children (many expression)) <*> optional (symbol Type *> children expression) <*> declarations))
|
||||||
<|> (symbol AsyncFunctionDefinition >>= \ loc -> children (makeAsyncFunctionDeclaration loc <$> async' <*> identifier <*> (symbol Parameters *> children (many expression)) <*> (optional (symbol Type *> children expression)) <*> (makeTerm <$> location <*> many declaration)))
|
<|> (symbol AsyncFunctionDefinition >>= \ loc -> children (makeAsyncFunctionDeclaration loc <$> async' <*> identifier <*> (symbol Parameters *> children (many expression)) <*> optional (symbol Type *> children expression) <*> declarations))
|
||||||
<|> (symbol Lambda >>= \ loc -> children (makeFunctionDeclaration loc <$> (makeTerm <$> symbol AnonLambda <*> (Syntax.Identifier <$> source)) <*> ((symbol LambdaParameters *> children (many expression)) <|> (pure [])) <*> (optional (symbol Type *> children expression)) <*> (makeTerm <$> location <*> many declaration)))
|
<|> (symbol Lambda >>= \ loc -> children (makeFunctionDeclaration loc <$> (makeTerm <$> symbol AnonLambda <*> (Syntax.Identifier <$> source)) <*> ((symbol LambdaParameters *> children (many expression)) <|> pure []) <*> optional (symbol Type *> children expression) <*> declarations))
|
||||||
where
|
where
|
||||||
makeFunctionDeclaration loc functionName' functionParameters ty functionBody = makeTerm loc $ Type.Annotation (makeTerm loc $ Declaration.Function functionName' functionParameters functionBody) (maybe (makeTerm loc Syntax.Empty) identity ty)
|
makeFunctionDeclaration loc functionName' functionParameters ty functionBody = makeTerm loc $ Type.Annotation (makeTerm loc $ Declaration.Function functionName' functionParameters functionBody) (maybe (makeTerm loc Syntax.Empty) identity ty)
|
||||||
makeAsyncFunctionDeclaration loc async' functionName' functionParameters ty functionBody = makeTerm loc $ Type.Annotation (makeTerm loc $ Type.Annotation (makeTerm loc $ Declaration.Function functionName' functionParameters functionBody) (maybe (makeTerm loc Syntax.Empty) identity ty)) async'
|
makeAsyncFunctionDeclaration loc async' functionName' functionParameters ty functionBody = makeTerm loc $ Type.Annotation (makeTerm loc $ Type.Annotation (makeTerm loc $ Declaration.Function functionName' functionParameters functionBody) (maybe (makeTerm loc Syntax.Empty) identity ty)) async'
|
||||||
@ -234,7 +243,7 @@ async' :: Assignment
|
|||||||
async' = makeTerm <$> symbol AnonAsync <*> (Syntax.Identifier <$> source)
|
async' = makeTerm <$> symbol AnonAsync <*> (Syntax.Identifier <$> source)
|
||||||
|
|
||||||
classDefinition :: Assignment
|
classDefinition :: Assignment
|
||||||
classDefinition = makeTerm <$> symbol ClassDefinition <*> children (Declaration.Class <$> identifier <*> argumentList <*> (many declaration))
|
classDefinition = makeTerm <$> symbol ClassDefinition <*> children (Declaration.Class <$> identifier <*> argumentList <*> many declaration)
|
||||||
where argumentList = symbol ArgumentList *> children (many expression)
|
where argumentList = symbol ArgumentList *> children (many expression)
|
||||||
<|> pure []
|
<|> pure []
|
||||||
|
|
||||||
@ -253,14 +262,15 @@ ellipsis = makeTerm <$> symbol Grammar.Ellipsis <*> (Language.Python.Syntax.Elli
|
|||||||
comparisonOperator :: Assignment
|
comparisonOperator :: Assignment
|
||||||
comparisonOperator = symbol ComparisonOperator >>= \ loc -> children (expression >>= \ lexpression -> makeComparison loc lexpression)
|
comparisonOperator = symbol ComparisonOperator >>= \ loc -> children (expression >>= \ lexpression -> makeComparison loc lexpression)
|
||||||
where
|
where
|
||||||
makeComparison loc lexpression = makeTerm loc <$ symbol AnonLAngle <*> (Expression.LessThan lexpression <$> expression)
|
makeComparison loc lexpression = makeTerm loc <$ symbol AnonLAngle <*> (Expression.LessThan lexpression <$> expression)
|
||||||
<|> makeTerm loc <$ symbol AnonLAngleEqual <*> (Expression.LessThanEqual lexpression <$> expression)
|
<|> makeTerm loc <$ symbol AnonLAngleEqual <*> (Expression.LessThanEqual lexpression <$> expression)
|
||||||
<|> makeTerm loc <$ symbol AnonRAngle <*> (Expression.GreaterThan lexpression <$> expression)
|
<|> makeTerm loc <$ symbol AnonRAngle <*> (Expression.GreaterThan lexpression <$> expression)
|
||||||
<|> makeTerm loc <$ symbol AnonRAngleEqual <*> (Expression.GreaterThanEqual lexpression <$> expression)
|
<|> makeTerm loc <$ symbol AnonRAngleEqual <*> (Expression.GreaterThanEqual lexpression <$> expression)
|
||||||
<|> makeTerm loc <$ symbol AnonEqualEqual <*> (Expression.Equal lexpression <$> expression)
|
<|> makeTerm loc <$ symbol AnonEqualEqual <*> (Expression.Equal lexpression <$> expression)
|
||||||
<|> makeTerm loc <$ symbol AnonBangEqual <*> (Expression.Not <$> (makeTerm <$> location <*> (Expression.Equal lexpression <$> expression)))
|
<|> makeTerm loc <$ symbol AnonBangEqual <*> (Expression.Not <$> (makeTerm <$> location <*> (Expression.Equal lexpression <$> expression)))
|
||||||
<|> makeTerm loc <$ symbol AnonNot <*> (Expression.Not <$> (makeTerm <$> location <*> (Expression.Member lexpression <$> expression)))
|
<|> makeTerm loc <$ symbol AnonLAngleRAngle <*> (Expression.Not <$> (makeTerm <$> location <*> (Expression.Equal lexpression <$> expression)))
|
||||||
<|> makeTerm loc <$ symbol AnonIn <*> (Expression.Member lexpression <$> expression)
|
<|> makeTerm loc <$ symbol AnonNot <*> (Expression.Not <$> (makeTerm <$> location <*> (Expression.Member lexpression <$> expression)))
|
||||||
|
<|> makeTerm loc <$ symbol AnonIn <*> (Expression.Member lexpression <$> expression)
|
||||||
-- source is used here to push the cursor to the next node to enable matching against `AnonNot`
|
-- source is used here to push the cursor to the next node to enable matching against `AnonNot`
|
||||||
<|> symbol AnonIs *> source *> (symbol AnonNot *> (makeTerm loc <$> Expression.Not <$> (makeTerm <$> location <*> (Expression.Equal lexpression <$> expression)))
|
<|> symbol AnonIs *> source *> (symbol AnonNot *> (makeTerm loc <$> Expression.Not <$> (makeTerm <$> location <*> (Expression.Equal lexpression <$> expression)))
|
||||||
<|> (makeTerm loc <$> Expression.Equal lexpression <$> expression))
|
<|> (makeTerm loc <$> Expression.Equal lexpression <$> expression))
|
||||||
@ -272,7 +282,7 @@ keyword :: Assignment
|
|||||||
keyword = makeTerm <$> symbol KeywordIdentifier <*> children (Syntax.Identifier <$> source)
|
keyword = makeTerm <$> symbol KeywordIdentifier <*> children (Syntax.Identifier <$> source)
|
||||||
|
|
||||||
tuple :: Assignment
|
tuple :: Assignment
|
||||||
tuple = makeTerm <$> symbol Tuple <*> children (Literal.Tuple <$> (many expression))
|
tuple = makeTerm <$> symbol Tuple <*> children (Literal.Tuple <$> many expression)
|
||||||
|
|
||||||
-- TODO: Consider flattening single element lists
|
-- TODO: Consider flattening single element lists
|
||||||
expressionList :: Assignment
|
expressionList :: Assignment
|
||||||
@ -396,12 +406,12 @@ deleteStatement = makeTerm <$> symbol DeleteStatement <*> children (Expression.C
|
|||||||
where deleteIdentifier = makeTerm <$> symbol AnonDel <*> (Syntax.Identifier <$> source)
|
where deleteIdentifier = makeTerm <$> symbol AnonDel <*> (Syntax.Identifier <$> source)
|
||||||
|
|
||||||
raiseStatement :: Assignment
|
raiseStatement :: Assignment
|
||||||
raiseStatement = makeTerm <$> symbol RaiseStatement <*> children (Statement.Throw <$> (makeTerm <$> location <*> many expression))
|
raiseStatement = makeTerm <$> symbol RaiseStatement <*> children (Statement.Throw <$> expressions)
|
||||||
|
|
||||||
ifStatement :: Assignment
|
ifStatement :: Assignment
|
||||||
ifStatement = makeTerm <$> symbol IfStatement <*> children (Statement.If <$> expression <*> statement <*> (flip (foldr makeElif) <$> many elifClause <*> optionalElse))
|
ifStatement = makeTerm <$> symbol IfStatement <*> children (Statement.If <$> expression <*> statements <*> (flip (foldr makeElif) <$> many elifClause <*> optionalElse))
|
||||||
where elseClause = symbol ElseClause *> children statement
|
where elseClause = symbol ElseClause *> children statements
|
||||||
elifClause = (,) <$ symbol ElifClause <*> location <*> children (Statement.If <$> expression <*> statement)
|
elifClause = (,) <$ symbol ElifClause <*> location <*> children (Statement.If <$> expression <*> statements)
|
||||||
optionalElse = fromMaybe <$> emptyTerm <*> optional elseClause
|
optionalElse = fromMaybe <$> emptyTerm <*> optional elseClause
|
||||||
makeElif (loc, makeIf) rest = makeTerm loc (makeIf rest)
|
makeElif (loc, makeIf) rest = makeTerm loc (makeIf rest)
|
||||||
|
|
||||||
|
6
test/fixtures/python/if-statement.A.py
vendored
6
test/fixtures/python/if-statement.A.py
vendored
@ -1,3 +1,9 @@
|
|||||||
if a:
|
if a:
|
||||||
b
|
b
|
||||||
c
|
c
|
||||||
|
elif d:
|
||||||
|
a
|
||||||
|
b
|
||||||
|
else:
|
||||||
|
x
|
||||||
|
y
|
||||||
|
Loading…
Reference in New Issue
Block a user