[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16163] branches/soc-2008-quorn/release/ scripts/bpymodules/BPyTextPlugin.py: Better class support with inheritance for text parsing.

Ian Thompson quornian at googlemail.com
Mon Aug 18 12:01:50 CEST 2008


Revision: 16163
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16163
Author:   quorn
Date:     2008-08-18 12:01:49 +0200 (Mon, 18 Aug 2008)

Log Message:
-----------
Better class support with inheritance for text parsing.

Modified Paths:
--------------
    branches/soc-2008-quorn/release/scripts/bpymodules/BPyTextPlugin.py

Modified: branches/soc-2008-quorn/release/scripts/bpymodules/BPyTextPlugin.py
===================================================================
--- branches/soc-2008-quorn/release/scripts/bpymodules/BPyTextPlugin.py	2008-08-18 02:29:25 UTC (rev 16162)
+++ branches/soc-2008-quorn/release/scripts/bpymodules/BPyTextPlugin.py	2008-08-18 10:01:49 UTC (rev 16163)
@@ -56,8 +56,9 @@
 	which it is defined is held in lineno.
 	"""
 	
-	def __init__(self, name, defs, vars, lineno, doc=''):
+	def __init__(self, name, parents, defs, vars, lineno, doc=''):
 		Definition.__init__(self, name, lineno, doc)
+		self.parents = parents
 		self.defs = defs
 		self.vars = vars
 
@@ -150,8 +151,11 @@
 	i = 1
 	
 	desc = get_cached_descriptor(txt)
-	if desc.classes.has_key(targets[0]):
-		local = desc.classes[targets[0]]
+	b = targets[0].find('(')
+	if b==-1: b = None # Trick to let us use [:b] and get the whole string
+	
+	if desc.classes.has_key(targets[0][:b]):
+		local = desc.classes[targets[0][:b]]
 	elif desc.defs.has_key(targets[0]):
 		local = desc.defs[targets[0]]
 	elif desc.vars.has_key(targets[0]):
@@ -159,8 +163,10 @@
 	
 	if local:
 		while i < count:
-			if hasattr(local, 'classes') and local.classes.has_key(targets[i]):
-				local = local.classes[targets[i]]
+			b = targets[i].find('(')
+			if b==-1: b = None
+			if hasattr(local, 'classes') and local.classes.has_key(targets[i][:b]):
+				local = local.classes[targets[i][:b]]
 			elif hasattr(local, 'defs') and local.defs.has_key(targets[i]):
 				local = local.defs[targets[i]]
 			elif hasattr(local, 'vars') and local.vars.has_key(targets[i]):
@@ -369,14 +375,21 @@
 				cls_indent = indent
 				cls_step = 1
 		
-		# Found 'class', look for cls_name followed by '('
+		# Found 'class', look for cls_name followed by '(' parents ')'
 		elif cls_step == 1:
 			if not cls_name:
 				if type == NAME:
 					cls_name = text
 					cls_sline = False
+					cls_parents = dict()
 					cls_defs = dict()
 					cls_vars = dict()
+			elif type == NAME:
+				if classes.has_key(text):
+					parent = classes[text]
+					cls_parents[text] = parent
+					cls_defs.update(parent.defs)
+					cls_vars.update(parent.vars)
 			elif text == ':':
 				cls_step = 2
 		
@@ -394,11 +407,11 @@
 				cls_doc = _trim_doc(text)
 			if cls_sline:
 				if type == NEWLINE:
-					classes[cls_name] = ClassDesc(cls_name, cls_defs, cls_vars, cls_lineno, cls_doc)
+					classes[cls_name] = ClassDesc(cls_name, cls_parents, cls_defs, cls_vars, cls_lineno, cls_doc)
 					cls_step = 0
 			else:
 				if type == DEDENT and indent <= cls_indent:
-					classes[cls_name] = ClassDesc(cls_name, cls_defs, cls_vars, cls_lineno, cls_doc)
+					classes[cls_name] = ClassDesc(cls_name, cls_parents, cls_defs, cls_vars, cls_lineno, cls_doc)
 					cls_step = 0
 		
 		#################
@@ -699,11 +712,22 @@
 	returns them as a list in the same order.
 	"""
 	
-	i = cursor - 1
-	while i >= 0 and (line[i].isalnum() or line[i] == '_' or line[i] == '.'):
+	brk = 0
+	targets = []
+	j = cursor
+	i = j-1
+	while i >= 0:
+		if line[i] == ')': brk += 1
+		elif brk:
+			if line[i] == '(': brk -= 1
+		else:
+			if line[i] == '.':
+				targets.insert(0, line[i+1:j]); j=i
+			elif not (line[i].isalnum() or line[i] == '_' or line[i] == '.'):
+				break
 		i -= 1
-	
-	return line[i+1:cursor].split('.')
+	targets.insert(0, line[i+1:j])
+	return targets
 
 def get_defs(txt):
 	"""Returns a dictionary which maps definition names in the source code to





More information about the Bf-blender-cvs mailing list