Adott egy projekt, benne sok-sok .js fájl. Hogyan, milyen eszközzel lehetne kigyűjteni egy listába a fájlokban deklarált változókat? Arra lennék kíváncsi, hogy nincs-e valamelyik duplikáltan létrehozva.
(Nem vagyok webfejlesztő, a javascripthez sem igen értek:( Ugyan írtam egy Python scriptet, ami megpróbálja a feladatot elvégezni, de nem vagyok biztos abban, hogy mindent figyelembe vettem; és gondolom csak van erre valami kész eszköz.)
- 1470 megtekintés
Hozzászólások
egy statikus kód analizátort futtass le inkább első körben, pl. jslint vagy jshint...
http://www.javascriptlint.com/docs/index.htm
https://stackoverflow.com/questions/29368015/how-to-display-all-javascr…
- A hozzászóláshoz be kell jelentkezni
Köszi, megnézem.
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Ez megvan, mert amint írtam, már készítettem egy Python scriptet, ami pont a 'var' szóra keres. Egyébként a 'var' nélkül is lehet deklarálni változót.
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
Ha stricre teszed a script futását, akkor kötelező a var szót használni.
https://www.w3schools.com/js/js_strict.asp
Minden .js fájl elejére be kell tenni.
Így biztosan "var"-ral kell deklarálni.
Biztosan figyeltél rá, de 'var ' vs. 'var' nem mindegy.
varangy+10;
var beka;
'var' esetében hibás találat is lesz.
- A hozzászóláshoz be kell jelentkezni
[Feliratkozás]
- A hozzászóláshoz be kell jelentkezni
"duplikáltan létrehozva": ez alatt azt érted, hogy létrehozásra kerül egy változó, majd utána egy másik részen újra használva lesz, de nem számolnak azzal, hogy már van értéke? erre az esetre a "var ..."-ra keresés nem biztos, hogy azokat az eseteket hozza ki, ami neked kell, mert lehet egy if két részében külön külön is létrehozva a változó, mégse lesz konfliktusuk.
Ha találtál megoldást dobd majd be ide, érdekes probléma.
- A hozzászóláshoz be kell jelentkezni
Úgy tudom, hogy a különböző fájlokban létrehozott globális változók a böngészőben egy "name space"-be kerülnek. Ha a .js fájlokat különböző programozók készítették, és véletlenül azonos nevű változókat deklaráltak különböző célokra, akkor a fel nem ismert "váltott" használat problémát fog okozni.
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
Ha a "var" deklaracio nem egyertelmu, akkor lehet erdemes lenne az egyenloseg jelre keresni, es megnezni, hogy mi van a bal oldalon, majd tolni ra egy uniq-t. Igy nem csak azok a valtozok lesznek meg, amiket adott scope-ban deklaraltak, hanem azok is, amiket egy objektumon belul. Ld.
var myObject = {};
myObject.myProp = "whatev";
- A hozzászóláshoz be kell jelentkezni
Ha a "myObject", ezen a néven, nincs két helyen létrehozva (lehet ilyent?), akkor a "belseje" nem okozhat névduplikációt.
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
Esetleg nézd meg az eslintet, esetleg no-implicit-globals, no-undef, no-shadow szabályokat.
Alacsonyabb szinten az esprima vagy espree segíthet hogy értelmezd a kódot, de ehhez JavaScript kell.
--
HUP Firefox extension | Hupper hibajelentés
- A hozzászóláshoz be kell jelentkezni
Köszi! Úgy tűnik, hogy az esprima-val meg lehet oldani a feladatot, vagy a tokenize()-zal vagy az AST előállításával, amik JSON formátumú kimenetek és a továbbiakban feldolgozhatók.
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
Az esprima-t még Pythonra is átírták:-)
https://pypi.org/project/esprima/
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
Végül ez lett, paradox módon Pythonban kigyűjtve a Javascript változókat:
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import os, os.path, sys, esprima
srcdir= sys.argv[1] if len(sys.argv)==2 else input("A bejárandó könyvtár neve:")
jsvars=set()
# Processing:
for curdir,subdirs,files in os.walk(srcdir):
for fi in files:
path=os.path.join(curdir,fi)
if not path.endswith(".js"):
continue
with open(path) as ff:
tokens= esprima.tokenize(ff.read())
tokens=(esprima.toDict(tokens))
#print(tokens)
for d in tokens:
if d["type"]=="Identifier":
jsvars.add( (d["value"],path) )
jsvars=list(jsvars)
def getdup(ll):
ll.sort()
ldup=[]
beg=(None,-1) # (variable_name, index_in_list)
for index,(var,path) in enumerate(ll):
if var != beg[0]:
if beg[0] and index-beg[1]>1 :
ldup.extend(ll[beg[1]:index])
beg=(var,index)
if beg[0] and index-beg[1]>1 :
ldup.extend(ll[beg[1]:index])
return ldup
for item in getdup(jsvars):
print(item)
---------
A kimenet ilyesmi(változó,fájl):
('ABCDE314', './subdir/test2.js')
('ABCDE314', './test1.js')
('abc', './subdir/test2.js')
('abc', './test1.js')
('vali100', './subdir/test2.js')
('vali100', './test1.js')
--
eutlantis
- A hozzászóláshoz be kell jelentkezni