Skip to content

Commit

Permalink
Merge pull request #117 from z7zmey/refactoring
Browse files Browse the repository at this point in the history
Refactoring
  • Loading branch information
z7zmey committed Dec 29, 2020
2 parents 0cd26d7 + 5fd7577 commit 4d6130d
Show file tree
Hide file tree
Showing 357 changed files with 163,638 additions and 130,246 deletions.
6 changes: 6 additions & 0 deletions .gitattributes
@@ -0,0 +1,6 @@
internal/php5/php5.go -diff -merge
internal/php5/php5.go linguist-generated=true
internal/php7/php7.go -diff -merge
internal/php7/php7.go linguist-generated=true
internal/scanner/scanner.go -diff -merge
internal/scanner/scanner.go linguist-generated=true
39 changes: 18 additions & 21 deletions Makefile
@@ -1,16 +1,13 @@
PHPFILE=example.php

all: compile fmt build run
all: compile fmt build

fmt:
find . -type f -iregex '.*\.go' -exec gofmt -l -s -w '{}' +

build:
go generate ./...
go build

run:
./php-parser -d go $(PHPFILE)
go build ./cmd/...

test:
go test ./...
Expand All @@ -19,38 +16,38 @@ cover:
go test ./... --cover

bench:
go test -benchmem -bench=. ./php5
go test -benchmem -bench=. ./php7

compile: ./php5/php5.go ./php7/php7.go ./scanner/scanner.go fmt
sed -i '' -e 's/yyErrorVerbose = false/yyErrorVerbose = true/g' ./php7/php7.go
sed -i '' -e 's/yyErrorVerbose = false/yyErrorVerbose = true/g' ./php5/php5.go
sed -i '' -e 's/\/\/line/\/\/ line/g' ./php5/php5.go
sed -i '' -e 's/\/\/line/\/\/ line/g' ./php7/php7.go
sed -i '' -e 's/\/\/line/\/\/ line/g' ./scanner/scanner.go
go test -benchmem -bench=. ./internal/php5
go test -benchmem -bench=. ./internal/php7

compile: ./internal/php5/php5.go ./internal/php7/php7.go ./internal/scanner/scanner.go
sed -i '' -e 's/yyErrorVerbose = false/yyErrorVerbose = true/g' ./internal/php7/php7.go
sed -i '' -e 's/yyErrorVerbose = false/yyErrorVerbose = true/g' ./internal/php5/php5.go
sed -i '' -e 's/\/\/line/\/\/ line/g' ./internal/php5/php5.go
sed -i '' -e 's/\/\/line/\/\/ line/g' ./internal/php7/php7.go
sed -i '' -e 's/\/\/line/\/\/ line/g' ./internal/scanner/scanner.go
rm -f y.output

./scanner/scanner.go: ./scanner/scanner.rl
./internal/scanner/scanner.go: ./internal/scanner/scanner.rl
ragel -Z -G2 -o $@ $<

./php5/php5.go: ./php5/php5.y
./internal/php5/php5.go: ./internal/php5/php5.y
goyacc -o $@ $<

./php7/php7.go: ./php7/php7.y
./internal/php7/php7.go: ./internal/php7/php7.y
goyacc -o $@ $<

cpu_pprof:
go test -cpuprofile cpu.pprof -bench=. -benchtime=20s ./php7
go test -cpuprofile cpu.pprof -bench=. -benchtime=20s ./internal/php7
go tool pprof ./php7.test cpu.pprof

mem_pprof:
go test -memprofile mem.pprof -bench=. -benchtime=20s -benchmem ./php7
go test -memprofile mem.pprof -bench=. -benchtime=20s -benchmem ./internal/php7
go tool pprof -alloc_objects ./php7.test mem.pprof

cpu_pprof_php5:
go test -cpuprofile cpu.prof -bench=. -benchtime=20s ./php5
go test -cpuprofile cpu.prof -bench=. -benchtime=20s ./internal/php5
go tool pprof ./php5.test cpu.prof

mem_pprof_php5:
go test -memprofile mem.prof -bench=. -benchtime=20s -benchmem ./php5
go test -memprofile mem.prof -bench=. -benchtime=20s -benchmem ./internal/php5
go tool pprof -alloc_objects ./php5.test mem.prof
112 changes: 62 additions & 50 deletions main.go → cmd/php-parser/main.go
Expand Up @@ -4,50 +4,73 @@ import (
"bytes"
"flag"
"fmt"
"io"
"io/ioutil"
"log"
"os"
"path/filepath"
"runtime"
"strconv"
"sync"
"time"

"github.com/pkg/profile"
"github.com/yookoala/realpath"
"github.com/z7zmey/php-parser/parser"
"github.com/z7zmey/php-parser/printer"
"github.com/z7zmey/php-parser/visitor"

"github.com/z7zmey/php-parser/pkg/ast"
"github.com/z7zmey/php-parser/pkg/cfg"
"github.com/z7zmey/php-parser/pkg/errors"
"github.com/z7zmey/php-parser/pkg/parser"
"github.com/z7zmey/php-parser/pkg/version"
"github.com/z7zmey/php-parser/pkg/visitor/dumper"
"github.com/z7zmey/php-parser/pkg/visitor/nsresolver"
"github.com/z7zmey/php-parser/pkg/visitor/printer"
"github.com/z7zmey/php-parser/pkg/visitor/traverser"
)

var wg sync.WaitGroup
var phpVersion string
var dumpType string
var phpVersion *version.Version
var profiler string
var withFreeFloating *bool
var dump *bool
var showResolvedNs *bool
var printBack *bool
var printPath *bool
var printErrors *bool
var printExecTime *bool

type file struct {
path string
content []byte
}

type result struct {
path string
parser parser.Parser
path string
rootNode ast.Vertex
errors []*errors.Error
}

func main() {
withFreeFloating = flag.Bool("ff", false, "parse and show free floating strings")
start := time.Now()
var phpVer string

printExecTime = flag.Bool("time", false, "print execution time")
showResolvedNs = flag.Bool("r", false, "resolve names")
printBack = flag.Bool("pb", false, "print AST back into the parsed file")
printPath = flag.Bool("p", false, "print filepath")
flag.StringVar(&dumpType, "d", "", "dump format: [custom, go, json, pretty_json]")
printErrors = flag.Bool("e", false, "print errors")
dump = flag.Bool("d", false, "dump")
flag.StringVar(&profiler, "prof", "", "start profiler: [cpu, mem, trace]")
flag.StringVar(&phpVersion, "phpver", "7.4", "php version")
flag.StringVar(&phpVer, "phpver", "7.4", "php version")

flag.Parse()

var err error
phpVersion, err = version.New(phpVer)
if err != nil {
fmt.Println("Error: " + err.Error())
os.Exit(1)
}

if len(flag.Args()) == 0 {
flag.Usage()
return
Expand Down Expand Up @@ -82,6 +105,11 @@ func main() {
wg.Wait()
close(fileCh)
close(resultCh)

elapsed := time.Since(start)
if *printExecTime {
log.Printf("took: %s", elapsed)
}
}

func processPath(pathList []string, fileCh chan<- *file) {
Expand Down Expand Up @@ -109,18 +137,19 @@ func parserWorker(fileCh <-chan *file, r chan<- result) {
return
}

parserWorker, err := parser.NewParser(f.content, phpVersion)
var parserErrors []*errors.Error
rootNode, err := parser.Parse(f.content, cfg.Config{
Version: phpVersion,
ErrorHandlerFunc: func(e *errors.Error) {
parserErrors = append(parserErrors, e)
},
})
if err != nil {
panic(err.Error())
fmt.Println("Error:" + err.Error())
os.Exit(1)
}

if *withFreeFloating {
parserWorker.WithFreeFloating()
}

parserWorker.Parse()

r <- result{path: f.path, parser: parserWorker}
r <- result{path: f.path, rootNode: rootNode, errors: parserErrors}
}
}

Expand All @@ -136,51 +165,34 @@ func printerWorker(r <-chan result) {
counter++

if *printPath {
fmt.Fprintf(os.Stdout, "==> [%d] %s\n", counter, res.path)
_, _ = io.WriteString(os.Stderr, "==> ["+strconv.Itoa(counter)+"] "+res.path+"\n")
}

for _, e := range res.parser.GetErrors() {
fmt.Fprintf(os.Stdout, "==> %s\n", e)
if *printErrors {
for _, e := range res.errors {
_, _ = io.WriteString(os.Stderr, "==> "+e.String()+"\n")
}
}

if *printBack {
o := bytes.NewBuffer([]byte{})
p := printer.NewPrinter(o)
p.Print(res.parser.GetRootNode())
res.rootNode.Accept(p)

err := ioutil.WriteFile(res.path, o.Bytes(), 0644)
checkErr(err)
}

var nsResolver *visitor.NamespaceResolver
if *showResolvedNs {
nsResolver = visitor.NewNamespaceResolver()
res.parser.GetRootNode().Walk(nsResolver)
v := nsresolver.NewNamespaceResolver()
traverser.NewTraverser(v).Traverse(res.rootNode)
for _, n := range v.ResolvedNames {
_, _ = io.WriteString(os.Stderr, "===> "+n+"\n")
}
}

switch dumpType {
case "custom":
dumper := &visitor.Dumper{
Writer: os.Stdout,
Indent: "| ",
NsResolver: nsResolver,
}
res.parser.GetRootNode().Walk(dumper)
case "json":
dumper := &visitor.JsonDumper{
Writer: os.Stdout,
NsResolver: nsResolver,
}
res.parser.GetRootNode().Walk(dumper)
case "pretty_json":
dumper := &visitor.PrettyJsonDumper{
Writer: os.Stdout,
NsResolver: nsResolver,
}
res.parser.GetRootNode().Walk(dumper)
case "go":
dumper := &visitor.GoDumper{Writer: os.Stdout}
res.parser.GetRootNode().Walk(dumper)
if *dump == true {
dumper.NewDumper(os.Stdout).WithPositions().WithTokens().Dump(res.rootNode)
}

wg.Done()
Expand Down
98 changes: 0 additions & 98 deletions freefloating/position_string.go

This file was deleted.

0 comments on commit 4d6130d

Please sign in to comment.