isFunctionDefinition removed

pull/7/head
aniket-engg 5 years ago committed by Aniket
parent de6e96b2f7
commit d5548b6201
  1. 13
      remix-analyzer/src/solidity-analyzer/modules/abstractAstView.ts
  2. 48
      remix-analyzer/src/solidity-analyzer/modules/staticAnalysisCommon.ts
  3. 13
      remix-analyzer/src/types.ts
  4. 20
      remix-analyzer/test/analysis/staticAnalysisCommon-test.ts

@ -1,8 +1,9 @@
import { isContractDefinition, getStateVariableDeclarationsFormContractNode, isInheritanceSpecifier, import { isContractDefinition, getStateVariableDeclarationsFormContractNode, isInheritanceSpecifier,
getInheritsFromName, isFunctionDefinition, isModifierDefinition, isModifierInvocation, getContractName, getInheritsFromName, isModifierDefinition, isModifierInvocation, getContractName,
getFunctionOrModifierDefinitionParameterPart, getType, getDeclaredVariableName, isVariableDeclaration, getFunctionOrModifierDefinitionParameterPart, getType, getDeclaredVariableName, isVariableDeclaration,
getFunctionOrModifierDefinitionReturnParameterPart } from './staticAnalysisCommon' getFunctionDefinitionReturnParameterPart } from './staticAnalysisCommon'
import { AstWalker } from 'remix-astwalker' import { AstWalker } from 'remix-astwalker'
import { CommonAstNode } from 'types'
export default class abstractAstView { export default class abstractAstView {
contracts = [] contracts = []
@ -48,8 +49,8 @@ export default class abstractAstView {
*/ */
build_visit (relevantNodeFilter) { build_visit (relevantNodeFilter) {
var that = this var that = this
return function (node) { return function (node: CommonAstNode) {
if (isContractDefinition(node)) { if (node.nodeType === "ContractDefinition") {
that.setCurrentContract(that, { that.setCurrentContract(that, {
node: node, node: node,
functions: [], functions: [],
@ -62,7 +63,7 @@ export default class abstractAstView {
const currentContract = that.getCurrentContract(that) const currentContract = that.getCurrentContract(that)
const inheritsFromName = getInheritsFromName(node) const inheritsFromName = getInheritsFromName(node)
currentContract.inheritsFrom.push(inheritsFromName) currentContract.inheritsFrom.push(inheritsFromName)
} else if (isFunctionDefinition(node)) { } else if (node.nodeType === "FunctionDefinition") {
that.setCurrentFunction(that, { that.setCurrentFunction(that, {
node: node, node: node,
relevantNodes: [], relevantNodes: [],
@ -163,7 +164,7 @@ export default class abstractAstView {
} }
private getReturnParameters (funcNode) { private getReturnParameters (funcNode) {
return this.getLocalVariables(getFunctionOrModifierDefinitionReturnParameterPart(funcNode)).map((n) => { return this.getLocalVariables(getFunctionDefinitionReturnParameterPart(funcNode)).map((n) => {
return { return {
type: getType(n), type: getType(n),
name: getDeclaredVariableName(n) name: getDeclaredVariableName(n)

@ -1,5 +1,7 @@
'use strict' 'use strict'
import { FunctionDefinitionAstNode, ModifierDefinitionAstNode, ParameterListAstNode } from "types"
const remixLib = require('remix-lib') const remixLib = require('remix-lib')
const util = remixLib.util const util = remixLib.util
@ -244,9 +246,9 @@ function getContractName (contract) {
* @funcDef {ASTNode} Function Definition node * @funcDef {ASTNode} Function Definition node
* @return {string} name of a function defined * @return {string} name of a function defined
*/ */
function getFunctionDefinitionName (funcDef) { function getFunctionDefinitionName (funcDef: FunctionDefinitionAstNode): string {
if (!isFunctionDefinition(funcDef)) throw new Error('staticAnalysisCommon.js: not an functionDefinition Node') // if (!isFunctionDefinition(funcDef)) throw new Error('staticAnalysisCommon.js: not an functionDefinition Node')
return funcDef.attributes.name return funcDef.name
} }
/** /**
@ -308,9 +310,9 @@ function getStateVariableDeclarationsFormContractNode (contractNode) {
* @funcNode {ASTNode} Contract Definition node * @funcNode {ASTNode} Contract Definition node
* @return {parameterlist node} parameterlist node * @return {parameterlist node} parameterlist node
*/ */
function getFunctionOrModifierDefinitionParameterPart (funcNode) { function getFunctionOrModifierDefinitionParameterPart (funcNode: FunctionDefinitionAstNode | ModifierDefinitionAstNode): ParameterListAstNode {
if (!isFunctionDefinition(funcNode) && !isModifierDefinition(funcNode)) throw new Error('staticAnalysisCommon.js: not a function definition') // if (!isFunctionDefinition(funcNode) && !isModifierDefinition(funcNode)) throw new Error('staticAnalysisCommon.js: not a function definition')
return funcNode.children[0] return funcNode.parameters
} }
/** /**
@ -320,9 +322,8 @@ function getFunctionOrModifierDefinitionParameterPart (funcNode) {
* @funcNode {ASTNode} Contract Definition node * @funcNode {ASTNode} Contract Definition node
* @return {parameterlist node} parameterlist node * @return {parameterlist node} parameterlist node
*/ */
function getFunctionOrModifierDefinitionReturnParameterPart (funcNode) { function getFunctionDefinitionReturnParameterPart (funcNode: FunctionDefinitionAstNode): ParameterListAstNode {
if (!isFunctionDefinition(funcNode) && !isModifierDefinition(funcNode)) throw new Error('staticAnalysisCommon.js: not a function definition') return funcNode.returnParameters
return funcNode.children[1]
} }
/** /**
@ -424,9 +425,9 @@ function getLoopBlockStartIndex (node) {
// #################### Trivial Node Identification // #################### Trivial Node Identification
function isFunctionDefinition (node) { // function isFunctionDefinition (node) {
return nodeType(node, exactMatch(nodeTypes.FUNCTIONDEFINITION)) // return nodeType(node, exactMatch(nodeTypes.FUNCTIONDEFINITION))
} // }
function isStatement (node) { function isStatement (node) {
return nodeType(node, 'Statement$') || isBlock(node) || isReturn(node) return nodeType(node, 'Statement$') || isBlock(node) || isReturn(node)
@ -664,11 +665,8 @@ function isStateVariable (name, stateVariables) {
* @node {ASTNode} some AstNode * @node {ASTNode} some AstNode
* @return {bool} * @return {bool}
*/ */
function isConstantFunction (node) { function isConstantFunction (node: FunctionDefinitionAstNode): boolean {
return isFunctionDefinition(node) && ( return node.stateMutability === 'view' || node.stateMutability === 'pure'
node.attributes.stateMutability === 'view' ||
node.attributes.stateMutability === 'pure'
)
} }
/** /**
@ -676,10 +674,8 @@ function isConstantFunction (node) {
* @node {ASTNode} some AstNode * @node {ASTNode} some AstNode
* @return {bool} * @return {bool}
*/ */
function isPayableFunction (node) { function isPayableFunction (node: FunctionDefinitionAstNode): boolean {
return isFunctionDefinition(node) && ( return node.stateMutability === 'payable'
node.attributes.stateMutability === 'payable'
)
} }
/** /**
@ -687,10 +683,8 @@ function isPayableFunction (node) {
* @node {ASTNode} some AstNode * @node {ASTNode} some AstNode
* @return {bool} * @return {bool}
*/ */
function isConstructor (node) { function isConstructor (node: FunctionDefinitionAstNode): boolean {
return isFunctionDefinition(node) && ( return node.kind === "constructor"
node.attributes.isConstructor === true
)
} }
/** /**
@ -1125,7 +1119,7 @@ export {
getFullQuallyfiedFuncDefinitionIdent, getFullQuallyfiedFuncDefinitionIdent,
getStateVariableDeclarationsFormContractNode, getStateVariableDeclarationsFormContractNode,
getFunctionOrModifierDefinitionParameterPart, getFunctionOrModifierDefinitionParameterPart,
getFunctionOrModifierDefinitionReturnParameterPart, getFunctionDefinitionReturnParameterPart,
getUnAssignedTopLevelBinOps, getUnAssignedTopLevelBinOps,
getLoopBlockStartIndex, getLoopBlockStartIndex,
@ -1179,7 +1173,7 @@ export {
// #################### Trivial Node Identification // #################### Trivial Node Identification
isDeleteUnaryOperation, isDeleteUnaryOperation,
isFunctionDefinition, // isFunctionDefinition,
isModifierDefinition, isModifierDefinition,
isInheritanceSpecifier, isInheritanceSpecifier,
isModifierInvocation, isModifierInvocation,

@ -542,6 +542,13 @@ export interface StructuredDocumentationAstNode {
text: string text: string
} }
export interface CommonAstNode {
id: number
nodeType: string
src: string
[x: string]: any
}
///////////////////////////////////////////////////////// /////////////////////////////////////////////////////////
///////////// YUL AST Nodes ///////////////////////////// ///////////// YUL AST Nodes /////////////////////////////
@ -580,6 +587,12 @@ export interface YulBlockAstNode {
src: string src: string
statements: Array<YulVariableDeclarationAstNode> statements: Array<YulVariableDeclarationAstNode>
} }
export interface CommonYulAstNode {
nodeType: string
src: string
[x: string]: any
}
/////////// ///////////

@ -306,16 +306,16 @@ test('staticAnalysisCommon.getLoopBlockStartIndex', function (t) {
// #################### Trivial Node Identification // #################### Trivial Node Identification
test('staticAnalysisCommon.isFunctionDefinition', function (t) { // test('staticAnalysisCommon.isFunctionDefinition', function (t) {
t.plan(3) // t.plan(3)
const node1 = { name: 'FunctionDefinition' } // const node1 = { name: 'FunctionDefinition' }
const node2 = { name: 'MemberAccess' } // const node2 = { name: 'MemberAccess' }
const node3 = { name: 'FunctionDefinitionBLABLA' } // const node3 = { name: 'FunctionDefinitionBLABLA' }
t.ok(common.isFunctionDefinition(node1), 'is exact match should work') // t.ok(common.isFunctionDefinition(node1), 'is exact match should work')
t.notOk(common.isFunctionDefinition(node2), 'different node should not work') // t.notOk(common.isFunctionDefinition(node2), 'different node should not work')
t.notOk(common.isFunctionDefinition(node3), 'substring should not work') // t.notOk(common.isFunctionDefinition(node3), 'substring should not work')
}) // })
test('staticAnalysisCommon.isModifierDefinition', function (t) { test('staticAnalysisCommon.isModifierDefinition', function (t) {
t.plan(3) t.plan(3)

Loading…
Cancel
Save