|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- """ Management of documents for AXDebugging.
- """
-
-
- import pythoncom
- import win32api
- from win32com.server.exception import Exception
- from win32com.server.util import unwrap
-
- from . import axdebug, codecontainer, contexts, gateways
- from .util import RaiseNotImpl, _wrap, _wrap_remove, trace
-
- # def trace(*args):
- # pass
-
-
- def GetGoodFileName(fname):
- if fname[0] != "<":
- return win32api.GetFullPathName(fname)
- return fname
-
-
- class DebugDocumentProvider(gateways.DebugDocumentProvider):
- def __init__(self, doc):
- self.doc = doc
-
- def GetName(self, dnt):
- return self.doc.GetName(dnt)
-
- def GetDocumentClassId(self):
- return self.doc.GetDocumentClassId()
-
- def GetDocument(self):
- return self.doc
-
-
- class DebugDocumentText(
- gateways.DebugDocumentInfo, gateways.DebugDocumentText, gateways.DebugDocument
- ):
- _com_interfaces_ = (
- gateways.DebugDocumentInfo._com_interfaces_
- + gateways.DebugDocumentText._com_interfaces_
- + gateways.DebugDocument._com_interfaces_
- )
- _public_methods_ = (
- gateways.DebugDocumentInfo._public_methods_
- + gateways.DebugDocumentText._public_methods_
- + gateways.DebugDocument._public_methods_
- )
-
- # A class which implements a DebugDocumentText, using the functionality
- # provided by a codeContainer
- def __init__(self, codeContainer):
- gateways.DebugDocumentText.__init__(self)
- gateways.DebugDocumentInfo.__init__(self)
- gateways.DebugDocument.__init__(self)
- self.codeContainer = codeContainer
-
- def _Close(self):
- self.docContexts = None
- # self.codeContainer._Close()
- self.codeContainer = None
-
- # IDebugDocumentInfo
- def GetName(self, dnt):
- return self.codeContainer.GetName(dnt)
-
- def GetDocumentClassId(self):
- return "{DF630910-1C1D-11d0-AE36-8C0F5E000000}"
-
- # IDebugDocument has no methods!
- #
-
- # IDebugDocumentText methods.
- # def GetDocumentAttributes
- def GetSize(self):
- # trace("GetSize")
- return self.codeContainer.GetNumLines(), self.codeContainer.GetNumChars()
-
- def GetPositionOfLine(self, cLineNumber):
- return self.codeContainer.GetPositionOfLine(cLineNumber)
-
- def GetLineOfPosition(self, charPos):
- return self.codeContainer.GetLineOfPosition(charPos)
-
- def GetText(self, charPos, maxChars, wantAttr):
- # Get all the attributes, else the tokenizer will get upset.
- # XXX - not yet!
- # trace("GetText", charPos, maxChars, wantAttr)
- cont = self.codeContainer
- attr = cont.GetSyntaxColorAttributes()
- return cont.GetText(), attr
-
- def GetPositionOfContext(self, context):
- trace("GetPositionOfContext", context)
- context = unwrap(context)
- return context.offset, context.length
-
- # Return a DebugDocumentContext.
- def GetContextOfPosition(self, charPos, maxChars):
- # Make one
- doc = _wrap(self, axdebug.IID_IDebugDocument)
- rc = self.codeContainer.GetCodeContextAtPosition(charPos)
- return rc.QueryInterface(axdebug.IID_IDebugDocumentContext)
-
-
- class CodeContainerProvider:
- """An abstract Python class which provides code containers!
-
- Given a Python file name (as the debugger knows it by) this will
- return a CodeContainer interface suitable for use.
-
- This provides a simple base imlpementation that simply supports
- a dictionary of nodes and providers.
- """
-
- def __init__(self):
- self.ccsAndNodes = {}
-
- def AddCodeContainer(self, cc, node=None):
- fname = GetGoodFileName(cc.fileName)
- self.ccsAndNodes[fname] = cc, node
-
- def FromFileName(self, fname):
- cc, node = self.ccsAndNodes.get(GetGoodFileName(fname), (None, None))
- # if cc is None:
- # print "FromFileName for %s returning None" % fname
- return cc
-
- def Close(self):
- for cc, node in self.ccsAndNodes.values():
- try:
- # Must close the node before closing the provider
- # as node may make calls on provider (eg Reset breakpoints etc)
- if node is not None:
- node.Close()
- cc._Close()
- except pythoncom.com_error:
- pass
- self.ccsAndNodes = {}
|