#region MetaDataImport
[StructLayout(LayoutKind.Sequential)]
public struct COR_FIELD_OFFSET
{
public uint ridOfField;
public uint ulOffset;
}
[ComImport, Guid("7DAC8207-D3AE-4c75-9B67-92801A497D44"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMetaDataImport
{
[PreserveSig]
void CloseEnum(uint hEnum);
uint CountEnum(uint hEnum);
void ResetEnum(uint hEnum, uint ulPos);
uint EnumTypeDefs(ref uint phEnum, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] uint[] rTypeDefs, uint cMax);
uint EnumInterfaceImpls(ref uint phEnum, uint td, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] uint[] rImpls, uint cMax);
uint EnumTypeRefs(ref uint phEnum, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] uint[] rTypeRefs, uint cMax);
uint FindTypeDefByName(string szTypeDef, uint tkEnclosingClass);
Guid GetScopeProps(StringBuilder szName, uint cchName, out uint pchName);
uint GetModuleFromScope();
uint GetTypeDefProps(uint td, IntPtr szTypeDef, uint cchTypeDef, out uint pchTypeDef, IntPtr pdwTypeDefFlags);
uint GetInterfaceImplProps(uint iiImpl, out uint pClass);
uint GetTypeRefProps(uint tr, out uint ptkResolutionScope, StringBuilder szName, uint cchName);
uint ResolveTypeRef(uint tr, [In] ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppIScope);
uint EnumMembers(ref uint phEnum, uint cl, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] uint[] rMembers, uint cMax);
uint EnumMembersWithName(ref uint phEnum, uint cl, string szName, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] uint[] rMembers, uint cMax);
//uint EnumMethods(ref uint phEnum, uint cl, uint* rMethods, uint cMax);
uint EnumMethods();
uint EnumMethodsWithName(ref uint phEnum, uint cl, string szName, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] uint[] rMethods, uint cMax);
//uint EnumFields(ref uint phEnum, uint cl, uint* rFields, uint cMax);
uint EnumFields();
uint EnumFieldsWithName(ref uint phEnum, uint cl, string szName, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] uint[] rFields, uint cMax);
uint EnumParams(ref uint phEnum, uint mb, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] uint[] rParams, uint cMax);
uint EnumMemberRefs(ref uint phEnum, uint tkParent, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] uint[] rMemberRefs, uint cMax);
uint EnumMethodImpls(ref uint phEnum, uint td, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] uint[] rMethodBody, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] uint[] rMethodDecl, uint cMax);
uint EnumPermissionSets(ref uint phEnum, uint tk, uint dwActions, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] uint[] rPermission, uint cMax);
uint FindMember(uint td, string szName, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] byte[] pvSigBlob, uint cbSigBlob);
uint FindMethod(uint td, string szName, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] byte[] pvSigBlob, uint cbSigBlob);
uint FindField(uint td, string szName, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] byte[] pvSigBlob, uint cbSigBlob);
uint FindMemberRef(uint td, string szName, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] byte[] pvSigBlob, uint cbSigBlob);
uint GetMethodProps(uint mb, out uint pClass, IntPtr szMethod, uint cchMethod, out uint pchMethod, IntPtr pdwAttr, IntPtr ppvSigBlob, IntPtr pcbSigBlob, IntPtr pulCodeRVA);
//uint GetMemberRefProps(uint mr, ref uint ptk, StringBuilder szMember, uint cchMember, out uint pchMember, out byte* ppvSigBlob);
uint GetMemberRefProps();
//uint EnumProperties(ref uint phEnum, uint td, uint* rProperties, uint cMax);
uint EnumProperties();
//uint EnumEvents(ref uint phEnum, uint td, uint* rEvents, uint cMax);
uint EnumEvents();
uint GetEventProps(uint ev, out uint pClass, StringBuilder szEvent, uint cchEvent, out uint pchEvent, out uint pdwEventFlags, out uint ptkEventType, out uint pmdAddOn, out uint pmdRemoveOn, out uint pmdFire, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 11)] uint[] rmdOtherMethod, uint cMax);
uint EnumMethodSemantics(ref uint phEnum, uint mb, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] uint[] rEventProp, uint cMax);
uint GetMethodSemantics(uint mb, uint tkEventProp);
uint GetClassLayout(uint td, out uint pdwPackSize, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] COR_FIELD_OFFSET[] rFieldOffset, uint cMax, out uint pcFieldOffset);
//uint GetFieldMarshal(uint tk, out byte* ppvNativeType);
uint GetFieldMarshal();
uint GetRVA(uint tk, out uint pulCodeRVA);
//uint GetPermissionSetProps(uint pm, out uint pdwAction, out void* ppvPermission);
uint GetPermissionSetProps();
//uint GetSigFromToken(uint mdSig, out byte* ppvSig);
uint GetSigFromToken();
uint GetModuleRefProps(uint mur, StringBuilder szName, uint cchName);
uint EnumModuleRefs(ref uint phEnum, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] uint[] rModuleRefs, uint cmax);
//uint GetTypeSpecFromToken(uint typespec, out byte* ppvSig);
uint GetTypeSpecFromToken();
uint GetNameFromToken(uint tk);
uint EnumUnresolvedMethods(ref uint phEnum, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] uint[] rMethods, uint cMax);
uint GetUserString(uint stk, StringBuilder szString, uint cchString);
uint GetPinvokeMap(uint tk, out uint pdwMappingFlags, StringBuilder szImportName, uint cchImportName, out uint pchImportName);
uint EnumSignatures(ref uint phEnum, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] uint[] rSignatures, uint cmax);
uint EnumTypeSpecs(ref uint phEnum, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] uint[] rTypeSpecs, uint cmax);
uint EnumUserStrings(ref uint phEnum, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] uint[] rStrings, uint cmax);
[PreserveSig]
int GetParamForMethodIndex(uint md, uint ulParamSeq, out uint pParam);
uint EnumCustomAttributes(ref uint phEnum, uint tk, uint tkType, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] uint[] rCustomAttributes, uint cMax);
//uint GetCustomAttributeProps(uint cv, out uint ptkObj, out uint ptkType, out void* ppBlob);
uint GetCustomAttributeProps();
uint FindTypeRef(uint tkResolutionScope, string szName);
//uint GetMemberProps(uint mb, out uint pClass, StringBuilder szMember, uint cchMember, out uint pchMember, out uint pdwAttr, out byte* ppvSigBlob, out uint pcbSigBlob, out uint pulCodeRVA, out uint pdwImplFlags, out uint pdwCPlusTypeFlag, out void* ppValue);
uint GetMemberProps();
//uint GetFieldProps(uint mb, out uint pClass, StringBuilder szField, uint cchField, out uint pchField, out uint pdwAttr, out byte* ppvSigBlob, out uint pcbSigBlob, out uint pdwCPlusTypeFlag, out void* ppValue);
uint GetFieldProps();
//uint GetPropertyProps(uint prop, out uint pClass, StringBuilder szProperty, uint cchProperty, out uint pchProperty, out uint pdwPropFlags, out byte* ppvSig, out uint pbSig, out uint pdwCPlusTypeFlag, out void* ppDefaultValue, out uint pcchDefaultValue, out uint pmdSetter, out uint pmdGetter, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=14)] uint[] rmdOtherMethod, uint cMax);
uint GetPropertyProps();
//uint GetParamProps(uint tk, out uint pmd, out uint pulSequence, StringBuilder szName, uint cchName, out uint pchName, out uint pdwAttr, out uint pdwCPlusTypeFlag, out void* ppValue);
uint GetParamProps();
//uint GetCustomAttributeByName(uint tkObj, string szName, out void* ppData);
uint GetCustomAttributeByName();
[return: MarshalAs(UnmanagedType.Bool)]
[PreserveSig]
bool IsValidToken(uint tk);
uint GetNestedClassProps(uint tdNestedClass);
//uint GetNativeCallConvFromSig(void* pvSig, uint cbSig);
uint GetNativeCallConvFromSig();
int IsGlobal(uint pd);
}
[ComImport, Guid("809c652e-7396-11d2-9771-00a0c9b4d50c"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), TypeLibType(TypeLibTypeFlags.FRestricted)]
internal interface IMetaDataDispenser
{
[return: MarshalAs(UnmanagedType.Interface)]
object DefineScope([In] ref Guid rclsid, [In] uint dwCreateFlags, [In] ref Guid riid);
[return: MarshalAs(UnmanagedType.Interface)]
object OpenScope([In, MarshalAs(UnmanagedType.LPWStr)] string szScope, [In] uint dwOpenFlags, [In] ref Guid riid);
[return: MarshalAs(UnmanagedType.Interface)]
object OpenScopeOnMemory([In] IntPtr pData, [In] uint cbData, [In] uint dwOpenFlags, [In] ref Guid riid);
}
[ComImport, Guid("E5CB7A31-7512-11d2-89CE-0080C792E5D8"), ClassInterface(ClassInterfaceType.None), TypeLibType(TypeLibTypeFlags.FCanCreate)]
internal class CorMetaDataDispenser
{
}
#endregion MetaDataImport
#region SymUnmanaged
[ComImport, Guid("40DE4037-7C81-3E1E-B022-AE1ABFF2CA08"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface ISymUnmanagedDocument
{
void GetURL(int size, out uint length, [MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 0)] StringBuilder url);
void GetDocumentType(out Guid retval);
void GetLanguage(out Guid retval);
void GetLanguageVendor(out Guid retval);
void GetCheckSumAlgorithmId(out Guid retval);
void GetCheckSum(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] byte[] data);
uint FindClosestLine(uint line);
bool HasEmbeddedSource();
uint GetSourceLength();
void GetSourceRange(uint startLine, uint startColumn, uint endLine, uint endColumn, uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] byte[] source);
}
[ComImport, Guid("B62B923C-B500-3158-A543-24F307A8B7E1"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface ISymUnmanagedMethod
{
uint GetToken();
uint GetSequencePointCount();
ISymUnmanagedScope GetRootScope();
ISymUnmanagedScope GetScopeFromOffset(uint offset);
uint Getoffset(ISymUnmanagedDocument document, uint line, uint column);
void GetRanges(ISymUnmanagedDocument document, uint line, uint column, uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] uint[] ranges);
void GetParameters(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedVariable[] parms);
IntPtr GetNamespace();
bool GetSourceStartEnd([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0, SizeConst = 2)] ISymUnmanagedDocument[] docs, [MarshalAs(UnmanagedType.LPArray)] uint[] lines, [MarshalAs(UnmanagedType.LPArray)] uint[] columns);
void GetSequencePoints(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] uint[] offsets, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.IUnknown, SizeParamIndex = 0)] IntPtr[] documents, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] uint[] lines, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] uint[] columns, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] uint[] endLines, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] uint[] endColumns);
}
[ComImport, Guid("B4CE6286-2A6B-3712-A3B7-1EE1DAD467B5"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface ISymUnmanagedReader
{
ISymUnmanagedDocument GetDocument(string url, ref Guid language, ref Guid languageVendor, ref Guid documentType);
void GetDocuments(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedDocument[] docs);
uint GetUserEntryPoint();
ISymUnmanagedMethod GetMethod(uint token);
ISymUnmanagedMethod GetMethodByVersion(uint token, int version);
void GetVariables(uint parent, uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] ISymUnmanagedVariable[] vars);
void GetGlobalVariables(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] ISymUnmanagedVariable[] vars);
ISymUnmanagedMethod GetMethodFromDocumentPosition(ISymUnmanagedDocument document, uint line, uint column);
void GetSymAttribute(uint parent, string name, ulong size, ref uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] buffer);
void GetNamespaces(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] IntPtr[] namespaces);
void Initialize([MarshalAs(UnmanagedType.IUnknown)] object importer, string filename, string searchPath, [MarshalAs(UnmanagedType.IUnknown)] object stream);
void UpdateSymbolStore(string filename, [MarshalAs(UnmanagedType.IUnknown)] object stream);
void ReplaceSymbolStore(string filename, [MarshalAs(UnmanagedType.IUnknown)] object stream);
void GetSymbolStoreFileName(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] char[] name);
void GetMethodsFromDocumentPosition(ISymUnmanagedDocument document, uint line, uint column, uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] ISymUnmanagedMethod[] retval);
void GetDocumentVersion(ISymUnmanagedDocument doc, out int version, out bool isLatest);
void GetMethodVersion(ISymUnmanagedMethod method, out int version);
}
[ComImport, Guid("68005D0F-B8E0-3B01-84D5-A11A94154942"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface ISymUnmanagedScope
{
ISymUnmanagedMethod GetMethod();
ISymUnmanagedScope GetParent();
void GetChildren(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] IntPtr[] children);
uint GetStartOffset();
uint GetEndOffset();
uint GetLocalCount();
void GetLocals(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] IntPtr[] locals);
void GetNamespaces(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] IntPtr[] namespaces);
}
[ComImport, Guid("9F60EEBE-2D9A-3F7C-BF58-80BC991C60BB"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface ISymUnmanagedVariable
{
void GetName(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] char[] name);
uint GetAttributes();
void GetSignature(uint size, out uint length, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] byte[] name);
uint GetAddressKind();
uint GetAddressField1();
uint GetAddressField2();
uint GetAddressField3();
uint GetStartOffset();
uint GetEndOffset();
}
[ComImport, Guid("ACCEE350-89AF-4ccb-8B40-1C2C4C6F9434"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), ComVisible(false)]
internal interface ISymUnmanagedBinder
{
ISymUnmanagedReader GetReaderForFile([MarshalAs(UnmanagedType.IUnknown)] object importer, string filename, string searchPath);
ISymUnmanagedReader GetReaderForStream([MarshalAs(UnmanagedType.IUnknown)] object importer, [MarshalAs(UnmanagedType.IUnknown)] object stream);
ISymUnmanagedReader GetReaderForFile2([MarshalAs(UnmanagedType.IUnknown)] object importer, [MarshalAs(UnmanagedType.LPWStr)] string fileName, [MarshalAs(UnmanagedType.LPWStr)] string searchPath, int searchPolicy);
}
[ComImport, Guid("0A29FF9E-7F9C-4437-8B11-F424491E3931")]
internal class CorSymBinder
{
}
#endregion SymUnmanaged
... << RSDN@Home 1.2.0 alpha rev. 642>>
Здравствуйте, IT!
Получите и распишитесь (LanguageService\NemerleAuthoringScope.cs):
public override string Goto(
VSConstants.VSStd97CmdID cmd,
IVsTextView textView,
int line,
int col,
out TextSpan span)
{
span = new TextSpan();
GotoInfo info = _project.GetGoto(_filePath, line, col, _sourceText);
if (info == null)
return null;
if (info.HasLocation)
{
span.iStartLine = info.LineStart;
span.iEndLine = info.LineEnd;
span.iStartIndex = info.ColStart;
span.iEndIndex = info.ColEnd;
return info.FilePath;
}
if (null != info.Member && !string.IsNullOrEmpty(info.FilePath))
{
Guid mdiGuid = new Guid("7DAC8207-D3AE-4c75-9B67-92801A497D44");
IntPtr mdiPtr = IntPtr.Zero;
object mdiUnk;
if (VSConstants.S_OK == _project.SmartOpenScope.OpenScope(info.FilePath, 0, ref mdiGuid, out mdiUnk))
{
try
{
mdiPtr = Marshal.GetIUnknownForObject(mdiUnk);
SymbolToken token = new SymbolToken(info.Member.GetHandle().MetadataToken);
ISymbolBinder1 binder = new SymBinder();
ISymbolReader reader = binder.GetReader(mdiPtr, info.FilePath, null);
ISymbolMethod method = reader.GetMethod(token);
if (method.SequencePointCount > 0)
{
ISymbolDocument[] documents = new ISymbolDocument[1];
int[] lines = new int[1];
int[] columns = new int[1];
int[] endLines = new int[1];
int[] endColumns = new int[1];
method.GetSequencePoints(null, documents, lines, columns, endLines, endColumns);
span.iStartLine = lines[0] - 1;
span.iEndLine = endLines[0] - 1;
span.iStartIndex = columns[0] - 1;
span.iEndIndex = endColumns[0] - 1;
return documents[0].URL;
}
}
catch (COMException)
{
// The file was not found or line numbers were stripped from pdb.
}
finally
{
if (IntPtr.Zero != mdiPtr)
Marshal.Release(mdiPtr);
}
}
}
return null;
}
Полужирным выделено то, чего мне не хватало и я тупо добавил:
GotoInfo.cs:
namespace Nemerle.Completion2
{
public class GotoInfo
{
[Accessor] mutable _filePath : string;
[Accessor] mutable _lineStart : int;
[Accessor] mutable _lineEnd : int;
[Accessor] mutable _colStart : int;
[Accessor] mutable _colEnd : int;
[Accessor] mutable _member : IMember;
public this(member : IMember)
{
_member = member;
SetLocation(member.Location);
}
}
}
ProjectInfo.cs:
public IVsSmartOpenScope SmartOpenScope
{
get { return (IVsSmartOpenScope) _site.GetService(typeof (SVsSmartOpenScope)); }
}
Кроме того, нужно добавить reference на ISymWrapper.DLL из каталога FrameWork'а.
Вот тут работает:
m() : Nemerle.TailRecursionTransparentAttribute
{
def i = Nemerle.TailRecursionTransparentAttribute(true);
i;
}
А тут нет:
Main() : void
{
printf("Hi!");
}
потому что Nemerle.IO.printf почему-то распознаётся как System.Console.Write() Причём в QuickTip тоже имеем System.Console.Write. Кто виноват и что делать
... << RSDN@Home 1.2.0 alpha rev. 642>>