Spaces:
Sleeping
Sleeping
""" 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 = {} | |