Skip to content

Commit

Permalink
Merge pull request #13 from ktutnik/master
Browse files Browse the repository at this point in the history
add es6 default parameter transformer
  • Loading branch information
ktutnik committed Apr 21, 2017
2 parents 49188f7 + 77134a9 commit deb2d65
Show file tree
Hide file tree
Showing 8 changed files with 107 additions and 7 deletions.
8 changes: 7 additions & 1 deletion src/analyzers/astree/parameter-analyzer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,14 @@ import { SyntaxKind, SourceLocation } from "../../core"
export class ParameterAnalyzer {
constructor(private node) { }

withDefaultValue(){
return this.node.type == SyntaxKind.AssignmentPattern
}

getName() {
return this.node.name;
if(this.withDefaultValue())
return this.node.left.name
else return this.node.name;
}

getLocation() {
Expand Down
1 change: 1 addition & 0 deletions src/analyzers/baseclasses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ export interface ModuleAnalyzer {
export interface ParameterAnalyzer {
getName(): string
getLocation(): SourceLocation
withDefaultValue():boolean
}

export interface ValueAnalyzer{
Expand Down
1 change: 1 addition & 0 deletions src/core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ export namespace SyntaxKind {
export const NullLiteral = "NullLiteral"
export const ObjectExpression = "ObjectExpression"
export const ObjectProperty = "ObjectProperty"
export const AssignmentPattern = "AssignmentPattern"
}

export module Call {
Expand Down
12 changes: 7 additions & 5 deletions src/transformers/es6-class-member.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@

import * as Analyzer from "../analyzers"
import { ParameterTransformer } from "./parameter"
import { ParameterWithDefaultTransformer } from "./parameter-with-default"
import * as Core from "../core"


export class Es6ClassMember extends Core.TransformerBase {
constructor(private parserType: Analyzer.ParserType) {
super()
}

@Core.Call.when(Core.SyntaxKind.ClassMethod)
transform(node, parent: Core.ClassMetaData) {
let analyser = <Analyzer.Es6MemberAnalyzer>Analyzer
Expand All @@ -23,13 +24,14 @@ export class Es6ClassMember extends Core.TransformerBase {
parameters: [],
decorators: undefined
}
if(!parent.methods) parent.methods = []
if(type == "Method")
if (!parent.methods) parent.methods = []
if (type == "Method")
parent.methods.push(method)
if(type == "Constructor")
if (type == "Constructor")
parent.constructor = method
this.traverse(analyser.getParameters(), method, [
new ParameterTransformer(this.parserType)
new ParameterTransformer(this.parserType),
new ParameterWithDefaultTransformer(this.parserType)
])
}
}
Expand Down
21 changes: 21 additions & 0 deletions src/transformers/parameter-with-default.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import * as Core from "../core"
import * as Analyzer from "../analyzers"

export class ParameterWithDefaultTransformer extends Core.TransformerBase {
constructor(private parserType: Analyzer.ParserType) {
super()
}

@Core.Call.when(Core.SyntaxKind.AssignmentPattern)
transform(node, parent: Core.MethodMetaData | Core.ConstructorMetaData) {
let analyzer = <Analyzer.ParameterAnalyzer>Analyzer
.get(this.parserType, Analyzer.AnalyzerType.Parameter, node)
if(!analyzer.withDefaultValue()) return
parent.parameters.push(<Core.ParameterMetaData>{
type: "Parameter",
name: analyzer.getName(),
analysis: Core.AnalysisType.Valid,
location: analyzer.getLocation(),
})
}
}
1 change: 1 addition & 0 deletions src/transformers/parameter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export class ParameterTransformer extends Core.TransformerBase {
transform(node, parent: Core.MethodMetaData | Core.ConstructorMetaData) {
let analyzer = <Analyzer.ParameterAnalyzer>Analyzer
.get(this.parserType, Analyzer.AnalyzerType.Parameter, node)
if(analyzer.withDefaultValue()) return
parent.parameters.push(<Core.ParameterMetaData>{
type: "Parameter",
name: analyzer.getName(),
Expand Down
2 changes: 1 addition & 1 deletion test/dummy.es6.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ namespace Module {
}

export class MyClass extends Module.MyClass {
constructor(par1) { super() }
constructor(par1 = 50) { super() }
myMethod() { }
}
68 changes: 68 additions & 0 deletions test/transformer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -185,5 +185,73 @@ describe("Transformer", () => {
location: { start: 0, end: 512 }
})
})

it("Should transform ES6 class with default parameter", () => {
let ast = JsParser.getAst(`
class MyClass {
constructor(par1, par2 = 300){}
myMethod(par1, par2 = 50) { }
}
exports.MyClass = MyClass;
`, true)
let test = new Transformer("file.js", "ASTree")
let result = test.transform(ast)
Chai.expect(result).deep.eq({
type: 'File',
name: 'file.js',
analysis: 1,
children:
[{
type: 'Class',
name: 'MyClass',
baseClass: undefined,
location: { start: 17, end: 152 },
analysis: 31,
methods:
[{
type: 'Method',
name: 'myMethod',
analysis: 1,
location: { start: 105, end: 134 },
parameters:
[{
type: 'Parameter',
name: 'par1',
analysis: 1,
location: { start: 114, end: 118 }
},
{
type: 'Parameter',
name: 'par2',
analysis: 1,
location: { start: 120, end: 129 }
}],
decorators: undefined
}],
constructor:
{
type: 'Constructor',
name: 'constructor',
analysis: 1,
location: { start: 53, end: 84 },
parameters:
[{
type: 'Parameter',
name: 'par1',
analysis: 1,
location: { start: 65, end: 69 }
},
{
type: 'Parameter',
name: 'par2',
analysis: 1,
location: { start: 71, end: 81 }
}],
decorators: undefined
}
}],
location: { start: 0, end: 208 }
})
})
})
})

0 comments on commit deb2d65

Please sign in to comment.