@@ -27,12 +27,13 @@ const (
2727)
2828
2929var (
30- regexpPhpFile = regexp .MustCompile (`(?://)?(/[^ ]*\.php)` )
31- regexpFilename__Win = regexp .MustCompile (`filename=["]?file:///(\S+)/Data/Temporary/.+?/Cache/Code/Flow_Object_Classes/([^"]*)\.php` )
32- regexpFilename__Unix = regexp .MustCompile (`filename=["]?file://(\S+)/Data/Temporary/.+?/Cache/Code/Flow_Object_Classes/([^"]*)\.php` )
33- regexpPathAndFilename = regexp .MustCompile (`(?m)^# PathAndFilename: (.*)$` )
34- regexpPackageClass = regexp .MustCompile (`(.*?)/Packages/[^/]*/(.*?)/Classes/(.*).php` )
35- regexpDot = regexp .MustCompile (`[\./]` )
30+ regexpPhpFile = regexp .MustCompile (`(?://)?(/[^ ]*\.php)` )
31+ regexpFilename__Win = regexp .MustCompile (`filename=["]?file:///(\S+)/Data/Temporary/.+?/Cache/Code/Flow_Object_Classes/([^"]*)\.php` )
32+ regexpFilename__Unix = regexp .MustCompile (`filename=["]?file://(\S+)/Data/Temporary/.+?/Cache/Code/Flow_Object_Classes/([^"]*)\.php` )
33+ regexpPathAndFilename = regexp .MustCompile (`(?m)^# PathAndFilename: (.*)$` )
34+ regexpPackageClass = regexp .MustCompile (`(.*?)/Packages/[^/]*/(.*?)/Classes/(.*).php` )
35+ regexpDistributionPackageClass = regexp .MustCompile (`(.*?)/DistributionPackages/(.*?)/Classes/(.*).php` )
36+ regexpDot = regexp .MustCompile (`[\./]` )
3637)
3738
3839func init () {
@@ -149,11 +150,16 @@ func (p *PathMapper) getRealFilename(path string) string {
149150}
150151
151152func (p * PathMapper ) mapPath (originalPath string ) string {
152- if strings .Contains (originalPath , "/Packages/" ) {
153+ if strings .Contains (originalPath , "/Packages/" ) ||
154+ strings .Contains (originalPath , "/DistributionPackages/" ) {
153155 p .logger .Debug ("Path %s is a Flow Package file" , originalPath )
154- cachePath := p .getCachePath (p .buildClassNameFromPath (originalPath ))
156+ basePath , className , err := pathToClassPath (originalPath )
157+ if err != nil {
158+ p .logger .Warn (err .Error ())
159+ return originalPath
160+ }
161+ cachePath := p .getCachePath (basePath , className )
155162 realPath := p .getRealFilename (cachePath )
156- var err error
157163 if len (p .config .LocalRoot ) == 0 {
158164 _ , err = os .Stat (realPath )
159165 }
@@ -206,23 +212,16 @@ func (p *PathMapper) readOriginalPathFromCache(path, basePath string) string {
206212 return path
207213}
208214
209- func (p * PathMapper ) buildClassNameFromPath (path string ) (string , string ) {
210- basePath , className := pathToClassPath (path )
211- if className == "" {
212- // Other (vendor) packages, todo add support for vendor package with Flow proxy class
213- p .logger .Warn (h , "Vendor package detected" )
214- p .logger .Warn ("Class mapping not supported currently for path: %s, \n " , path )
215- }
216- return basePath , className
217- }
218-
219215// Convert absolute path to class path (internal use only)
220- func pathToClassPath (path string ) (string , string ) {
216+ func pathToClassPath (path string ) (string , string , error ) {
221217 var (
222218 basePath string
223219 classPath string
224220 )
225221 match := regexpPackageClass .FindStringSubmatch (path )
222+ if len (match ) != 4 {
223+ match = regexpDistributionPackageClass .FindStringSubmatch (path )
224+ }
226225 if len (match ) == 4 {
227226 // Flow standard packages
228227 packagePath := regexpDot .ReplaceAllString (match [2 ], "/" )
@@ -234,9 +233,7 @@ func pathToClassPath(path string) (string, string) {
234233 basePath = match [1 ]
235234 classPath = regexpDot .ReplaceAllString (classPath , "_" )
236235 } else {
237- // Other (vendor) packages, todo add support for vendor package with Flow proxy class
238- basePath = path
239- classPath = ""
236+ return "" , "" , fmt .Errorf ("path %s does not match known class path patterns, may be an (unsupported) vendor package" , path )
240237 }
241- return basePath , classPath
238+ return basePath , classPath , nil
242239}
0 commit comments