@@ -239,49 +239,44 @@ def merge_lbox_data(self, node, path):
239239 analyser = self .get_lboxanalyser (root )
240240 analyser .analyse (root , self .parsers )
241241
242- # convert variables, functions
243- if node .symbol .name == "<Python + PHP>" :
244- # merge python into php
245- original = "variable"
246- dest = "function"
247- max_path = 1
248- elif node .symbol .name == "<PHP + Python>" :
249- # merge php into python
250- original = "function"
251- dest = "variable"
252- max_path = 1
253- else :
254- return
255- for method in analyser .data .get (original ,[]):
256- if len (method .path ) > max_path :
242+ for kind in analyser .data :
243+ if kind in ["File" , "reference" ]:
257244 continue
258- uri = self . convert_uri ( dest , method , path )
259- uri . nbrule = NBRule ( "none" , [], {} )
260- self .add_uri (uri )
245+ for obj in analyser . data [ kind ]:
246+ uri = self . convert_uri ( kind , obj , path )
247+ self .add_uri (uri )
261248
262249 # convert references
263250 for ref in analyser .data .get ("reference" ,[]):
264251 # if reference couldn't be resolved, try in outer lbox
265252 if ref .node in analyser .errors :
266253 del analyser .errors [ref .node ]
267254 uri = self .convert_uri ("reference" , ref , path )
268- if uri .name .startswith ("$" ):
255+ if uri .name .startswith ("$" ): # XXX PHP hack
269256 uri .name = uri .name [1 :]
270- else :
271- uri .name = "$" + uri .name
272- uri .nbrule = NBRule ("none" , [], {"references" :(["variable" ], ["function" ])})
257+ uri .nbrule = NBRule ("none" , [], {"references" :(["variable" , "function" ], ["name" ])})
273258 self .add_uri (uri )
274259 return
275260
276261 def convert_uri (self , newkind , prev , path ):
277- uri = URI ()
278- uri .kind = newkind
279- uri .astnode = prev .astnode
280- uri .node = prev .node
281- uri .path = path
282- uri .name = prev .name
283- uri .vartype = prev .vartype
284- uri .index = self .index
262+ uri = prev
263+ # There is currently no easy way to find out if a namebinding rule
264+ # belongs to the top-level grammar rule. However, the top-level
265+ # namebinding rule typically doesn't have a name as there is no need for
266+ # it to have one. So we can use this to determine which rule is the
267+ # top-level and then remove it when merging a sublanguage's rules into
268+ # the outer language. However, if a user decides to give the top-level
269+ # namebinding rule a name, cross-language namebinding won't work, and
270+ # we currently can't guard against that.
271+ if len (prev .path ) > 0 and prev .path [0 ].name is None :
272+ # Replace language box's top level with current location
273+ uri .path .pop (0 )
274+ for p in reversed (path ):
275+ uri .path .insert (0 , p )
276+ else :
277+ # Language box has no top-level (subgrammar)
278+ for p in reversed (path ):
279+ uri .path .insert (0 , p )
285280 return uri
286281
287282 def add_uri (self , uri ):
@@ -385,8 +380,6 @@ def get_completion(self, scope):
385380 lbox = root .get_magicterminal ()
386381 analyser = self .get_lboxanalyser (root )
387382 lboxresults = []
388- if analyser and analyser is not self :
389- lboxresults = analyser .get_completion (scope )
390383 if analyser is self :
391384 lbox = None
392385 astnode = self .get_correct_astnode (scope , analyser , lbox )
@@ -417,9 +410,6 @@ def get_correct_astnode(self, scope, analyser=None, lbox=None):
417410 # astnode must have a corresponding entry in self.data
418411 if nbrule :
419412 deftype = nbrule .get_deftype ()
420- if lbox and lbox .symbol .name == "<Python + PHP>" :
421- if deftype == "variable" : # convert to find it in data
422- deftype = "function"
423413 if self .data .has_key (deftype ):
424414 for e in self .data [deftype ]:
425415 if e .astnode is astnode :
0 commit comments