Skip to content

Commit ff8a692

Browse files
authored
fix: merge internal functions templates (#75)
1 parent 2476e3e commit ff8a692

File tree

5 files changed

+24
-53
lines changed

5 files changed

+24
-53
lines changed

src/context.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ export function internalFunctionContext(node: FunctionDefinition): InternalFunct
4646
}
4747

4848
// Check if the function is view or pure
49-
const isView = node.stateMutability === FunctionStateMutability.View;
5049
const isPure = node.stateMutability === FunctionStateMutability.Pure;
50+
const isView = node.stateMutability === FunctionStateMutability.View || isPure;
5151

5252
// Save the internal function information
5353
return {

src/templates/partials/internal-function.hbs

+20-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ function mock_call_{{functionName}}({{parameters}}) public {
66
);
77
}
88

9-
function {{functionName}}({{inputs}}) internal override {{#if outputs}}returns ({{outputs}}){{/if}} {
10-
(bool _success, bytes memory _data) = address(this).call(abi.encodeWithSignature('{{signature}}'{{#if inputs}}, {{#each inputNames}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}{{/if}}));
9+
function {{functionName}}{{#if isPure}}Helper{{/if}}({{inputs}}) internal {{#if isView}}view{{/if}} {{#unless isPure}}override{{/unless}} {{#if outputs}}returns ({{outputs}}){{/if}} {
10+
(bool _success, bytes memory _data) = address(this).{{#if isView}}static{{/if}}call(abi.encodeWithSignature('{{signature}}'{{#if inputs}}, {{#each inputNames}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}{{/if}}));
1111

1212
if (_success) return abi.decode(_data, ({{#each outputTypes}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}));
1313

@@ -23,3 +23,21 @@ function call_{{functionName}}({{inputs}}) public {{#if outputs}}returns ({{outp
2323
function expectCall_{{functionName}}({{#if inputs}}{{inputs}}{{/if}}) public {
2424
vm.expectCall(address(this), abi.encodeWithSignature('{{signature}}'{{#if inputs}}, {{#each inputNames}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}{{/if}}));
2525
}
26+
27+
{{#if isPure}}
28+
29+
function _{{functionName}}CastToPure(function({{#each inputTypes}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}) internal view {{#if outputs}}returns ({{explicitOutputTypes}}){{/if}} fnIn)
30+
internal
31+
pure
32+
returns (function({{#each inputTypes}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}) internal pure {{#if outputs}}returns ({{explicitOutputTypes}}){{/if}} fnOut)
33+
{
34+
assembly {
35+
fnOut := fnIn
36+
}
37+
}
38+
39+
function {{functionName}}({{inputs}}) internal pure override {{#if outputs}}returns ({{outputs}}){{/if}} {
40+
return _{{functionName}}CastToPure({{functionName}}Helper)({{#each inputNames}}{{this}}{{#unless @last}}, {{/unless}}{{/each}});
41+
}
42+
43+
{{/if}}

src/templates/partials/internal-view-function.hbs

-43
This file was deleted.

src/utils.ts

+1-6
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,6 @@ export async function renderNodeMock(node: ASTNode): Promise<string> {
192192
constructor: constructorContext,
193193
'external-or-public-function': externalOrPublicFunctionContext,
194194
'internal-function': internalFunctionContext,
195-
'internal-view-function': internalFunctionContext,
196195
import: importContext,
197196
};
198197

@@ -222,11 +221,7 @@ export function partialName(node: ASTNode): string {
222221
} else if (node.visibility === 'external' || node.visibility === 'public') {
223222
return 'external-or-public-function';
224223
} else if (node.visibility === 'internal' && node.virtual) {
225-
if (node.stateMutability === 'view' || node.stateMutability === 'pure') {
226-
return 'internal-view-function';
227-
} else {
228-
return 'internal-function';
229-
}
224+
return 'internal-function';
230225
}
231226
} else if (node instanceof ImportDirective) {
232227
return 'import';

test/unit/context/internalFunctionContext.spec.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,10 @@ describe('internalFunctionContext', () => {
198198
it('determines whether the function is view or not', () => {
199199
for (const stateMutability in FunctionStateMutability) {
200200
const isView = FunctionStateMutability[stateMutability] === FunctionStateMutability.View;
201+
const isPure = FunctionStateMutability[stateMutability] === FunctionStateMutability.Pure;
201202
const node = mockFunctionDefinition({ ...defaultAttributes, stateMutability: FunctionStateMutability[stateMutability] });
202203
const context = internalFunctionContext(node);
203-
expect(context.isView).to.be.equal(isView);
204+
expect(context.isView).to.be.equal(isView || isPure);
204205
}
205206
});
206207

0 commit comments

Comments
 (0)