public static bool TryGetInterfaceMember(CSharpMember member, out CSharpMember interfaceMethod)
        {
            Contract.Requires(member != null);
            Contract.Ensures(!Contract.Result <bool>() ||
                             Contract.ValueAtReturn(out interfaceMethod) != null);

            interfaceMethod = null;

            if (member.ExplicitInterfaceImplementation != null)
            {
                if (TryGetMemberWithSameSignatureFromType(member.ExplicitInterfaceImplementation, member, out interfaceMethod))
                {
                    return(true);
                }
            }

            if (member.ContainingType == null || member.ContainingType.BaseInterfaces == null)
            {
                return(false);
            }

            foreach (var i in member.ContainingType.BaseInterfaces)
            {
                if (i == null)
                {
                    continue;
                }
                if (TryGetMemberWithSameSignatureFromType(i, member, out interfaceMethod))
                {
                    return(true);
                }
            }
            return(false);
        }
        public IllFormedSemanticModelException(string message, CSharpMember badMember) : base(message)
        {
            Contract.Requires(badMember != null);

            BadMember = badMember;
            Kind      = CSharpKind.CSharpMember;
        }
        public static bool TryGetMemberWithSameSignatureFromType(CSharpType type, CSharpMember memberToMatch, out CSharpMember member)
        {
            Contract.Requires(type != null);
            Contract.Requires(memberToMatch != null);
            Contract.Ensures(!Contract.Result <bool>() || Contract.ValueAtReturn(out member) != null);

            member = null;
            var members = type.Members;

            if (members == null)
            {
                throw new IllFormedSemanticModelException("A CSharpType was found with a null 'Members' field.", type);
            }
            foreach (var m in members)
            {
                if (m == null)
                {
                    throw new IllFormedSemanticModelException("An null 'member' was found in a CSharpType's 'Members' field.", type);
                }
                if (MembersAreEquivalent(m, memberToMatch))
                {
                    member = m;
                    return(true);
                }
            }
            return(false);
        }
Example #4
0
        public bool TryGetPropertyContract(CSharpMember semanticMember, out IMethodContract getterContract, out IMethodContract setterContract)
        {
            Contract.Requires(semanticMember == null || semanticMember.IsProperty || semanticMember.IsIndexer);

            getterContract = null;
            setterContract = null;

            #region Check input
            if (semanticMember == null)
            {
                return(false);
            }
            #endregion
            IMethodReference getter, setter;
            if (!TryGetPropertyAccessorReferences(semanticMember, out getter, out setter))
            {
                return(false);
            }

            var success = false;
            if (getter != null)
            {
                success |= TryGetMethodContract(getter, out getterContract);
            }
            if (setter != null)
            {
                success |= TryGetMethodContract(setter, out setterContract);
            }
            return(success);
        }
Example #5
0
        private string GetFormattedContracts(CSharpMember semanticMember)
        {
            Contract.Requires(semanticMember != null);
            Contract.Requires(semanticMember.IsMethod || semanticMember.IsConstructor || semanticMember.IsProperty || semanticMember.IsIndexer);

            if (semanticMember.IsProperty || semanticMember.IsIndexer)
            {
                IMethodContract setter, getter;
                if (!((ContractsProvider)_textViewTracker.ProjectTracker.ContractsProvider).TryGetPropertyContract(semanticMember, out getter, out setter))
                {
                    return(null);
                }
                return(IntellisenseContractsHelper.FormatPropertyContracts(getter, setter));
            }

            //Can we get our contracts?
            IMethodContract methodContracts;

            if (!((ContractsProvider)_textViewTracker.ProjectTracker.ContractsProvider).TryGetMethodContract(semanticMember, out methodContracts))
            {
                return(null);
            }

            //Can we get our formatted contracts?
            return(IntellisenseContractsHelper.FormatContracts(methodContracts));
        }
Example #6
0
        private IEnumerable <CSharpMember> FindHideBySigMethod(CSharpType type, CSharpMember member, bool checkBaseTypes, bool includeInheritedInterfaces)
        {
            List <CSharpMember> results = new List <CSharpMember>();

            FindHideBySigMethod(results, type, member, checkBaseTypes, includeInheritedInterfaces);
            return(results);
        }
        public static CSharpMember Uninstantiate(this CSharpMember member)
        {
            Contract.Requires(member != null);
            Contract.Ensures(Contract.Result <CSharpMember>() != null);
            Contract.Ensures(member.IsMethod == Contract.Result <CSharpMember>().IsMethod);
            Contract.Ensures(member.IsConstructor == Contract.Result <CSharpMember>().IsConstructor);
            Contract.Ensures(member.IsProperty == Contract.Result <CSharpMember>().IsProperty);
            Contract.Ensures(member.IsIndexer == Contract.Result <CSharpMember>().IsIndexer);

            var uninstantiatedMember = member;

            var definingMember = member.DefiningMember;

            while (definingMember != null)
            {
                uninstantiatedMember = definingMember;
                definingMember       = definingMember.DefiningMember;
            }

            Contract.Assume(member.IsMethod == uninstantiatedMember.IsMethod);
            Contract.Assume(member.IsConstructor == uninstantiatedMember.IsConstructor);
            Contract.Assume(member.IsProperty == uninstantiatedMember.IsProperty);
            Contract.Assume(member.IsIndexer == uninstantiatedMember.IsIndexer);
            return(uninstantiatedMember);
        }
Example #8
0
        protected override void OnExecute(Microsoft.VisualStudio.Shell.OleMenuCommand command)
        {
            int        curLineIndex, curColumnIndex;
            VSTextView textView = new VSTextView(VSTextView.ActiveTextView);

            if (textView == null)
            {
                MessageBox.Show("textView is null");
                return;
            }

            textView.GetCursorPositon(out curLineIndex, out curColumnIndex);

            //帮助:http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/c62a70eb-d84c-4410-890d-b41a86b2b55f/
            ILangService langService;

            LangService_GetInstance(out langService);
            if (langService == null)
            {
                MessageBox.Show("langService is null");
                return;
            }

            IDECompilerHost compilerHost = new IDECompilerHost();

            IProject prj;
            Project  currentPro = VSDocument.ActiveDocument.ProjectItem.ContainingProject;

            LangService_GetDteProject(langService, currentPro, out prj);
            if (prj == null)
            {
                MessageBox.Show("prj is null");
                return;
            }

            FileName   fileName = new Microsoft.RestrictedUsage.CSharp.Core.FileName(VSDocument.ActiveDocument.FullName);
            CSRPOSDATA data     = new CSRPOSDATA()
            {
                LineIndex = curLineIndex, ColumnIndex = curColumnIndex
            };
            CSharpMember m = Utilities.GetMemberAtLocation(compilerHost, prj, fileName.Value, data);

            if (m != null && m.ReturnType != null)
            {
                string returnName = m.ReturnType.GetFormattedName(InteropTypeFormatFlags.TypeFormatFlags_BestNameGUI);

                returnName = FilterReturnName(returnName);
                if (string.IsNullOrEmpty(returnName))
                {
                    return;
                }

                int insertCol = GetInsertPosition(textView, curLineIndex, curColumnIndex);
                textView.InsertText(returnName + " v =", curLineIndex, insertCol);
                textView.SelectText(curLineIndex, insertCol + returnName.Length + 1, curLineIndex, insertCol + returnName.Length + 2);
            }
        }
Example #9
0
        public static void NavigateToMember(CSharpMemberIdentifier memberIdentifier)
        {
            bool result = false;

            try
            {
                CSharpMember currentMember = ResolveMember(memberIdentifier);
                if (currentMember == null)
                {
                    return;
                }

                var sourceLocations = currentMember.SourceLocations;
                if (sourceLocations == null || sourceLocations.Count == 0)
                {
                    return;
                }

                var location = sourceLocations[0];
                if (location.FileName == null || !location.Position.IsValid)
                {
                    return;
                }

                CSRPOSDATA position = new CSRPOSDATA()
                {
                    LineIndex   = location.Position.Line,
                    ColumnIndex = location.Position.Character
                };

                ILangService languageService;
                CSharpInheritanceAnalyzer.LangService_GetInstance(out languageService);
                if (languageService == null)
                {
                    return;
                }

                IProject project = null;
                languageService.OpenSourceFile(project, location.FileName.Value, position);
            }
            catch (ApplicationException)
            {
                ////_callHierarchy.LanguageService.DisplayErrorMessage(exception.Message);
                return;
            }
            catch (InvalidOperationException)
            {
                ////this._callHierarchy.LanguageService.DisplayErrorMessage(exception2.Message);
                return;
            }

            if (!result)
            {
                ////NativeMessageId.Create(this._callHierarchy.LanguageService, jrc_StringResource_identifiers.IDS_HIDDEN_DEFINITION, new object[0]).DisplayError(this._callHierarchy.LanguageService);
            }
        }
        public ISet <CSharpMemberIdentifier> GetImplementorsForInterfaceMember(CSharpMemberIdentifier memberId)
        {
            CSharpMember member = CSharpInheritanceAnalyzer.ResolveMemberIdentifier(AllProjects, memberId).Item1;
            ISet <CSharpMemberIdentifier> resultList = CreateHashSet <CSharpMemberIdentifier>(new CSharpMemberIdentifierEqualityComparer());

            if (!IsSupportedMemberType(member))
            {
                return(resultList);
            }

            AddImplementorsForInterfaceMember(member, resultList);
            return(resultList);
        }
        public ISet <CSharpMemberIdentifier> GetOverridersFromDerivedTypes(CSharpMemberIdentifier memberId)
        {
            CSharpMember member = CSharpInheritanceAnalyzer.ResolveMemberIdentifier(AllProjects, memberId).Item1;
            ISet <CSharpMemberIdentifier> resultList = CreateHashSet <CSharpMemberIdentifier>(new CSharpMemberIdentifierEqualityComparer());

            if (!IsSupportedMemberType(member))
            {
                return(resultList);
            }

            AddVirtualOverridersFromDerivedTypes(member, resultList);
            return(resultList);
        }
Example #12
0
        public bool TryGetMethodContractSafe(CSharpMember semanticMehod, out IMethodContract methodContract)
        {
            Contract.Requires(semanticMehod == null || semanticMehod.IsMethod || semanticMehod.IsConstructor);
            Contract.Ensures(!Contract.Result <bool>() || (Contract.ValueAtReturn(out methodContract) != null));

            methodContract = null;

            #region Check input
            if (semanticMehod == null)
            {
                return(false);
            }
            #endregion
            #region Call TryGetMethodContract cautiously
            try {
                //Can we get contracts?
                if (!TryGetMethodContract(semanticMehod, out methodContract))
                {
                    return(false);
                }
            }
            #endregion
            #region Abort on exception
            //Give up on our contracts if we get an exception
            catch (IllFormedSemanticModelException) {
                return(false);
            } catch (InvalidOperationException e) {
                if (!e.Message.Contains(ContractsPackageAccessor.InvalidOperationExceptionMessage_TheSnapshotIsOutOfDate))
                {
                    throw e;
                }
                else
                {
                    return(false);
                }
            } catch (System.Runtime.InteropServices.COMException e) {
                if (!e.Message.Contains(ContractsPackageAccessor.COMExceptionMessage_BindingFailed))
                {
                    throw e;
                }
                else
                {
                    return(false);
                }
            }
            #endregion

            return(methodContract != null);
        }
        public static CallingConvention GetCallingConventionFor(CSharpMember semanticMember)
        {
            Contract.Requires(semanticMember != null);

            var callingConvention = CallingConvention.Default;

            if (semanticMember.IsMethod)
            {
                if (semanticMember.TypeParameters != null && semanticMember.TypeParameters.Count > 0)
                {
                    callingConvention = callingConvention | CallingConvention.Generic;
                }
            }
            if (!semanticMember.IsStatic)
            {
                callingConvention = callingConvention | CallingConvention.HasThis;
            }
            return(callingConvention);
        }
Example #14
0
        public bool TryGetMethodContract(CSharpMember semanticMethod, out IMethodContract methodContract)
        {
            Contract.Requires(semanticMethod == null || semanticMethod.IsConstructor || semanticMethod.IsMethod);
            Contract.Ensures(!Contract.Result <bool>() || (Contract.ValueAtReturn(out methodContract) != null));

            methodContract = null;

            #region Check input
            if (semanticMethod == null)
            {
                return(false);
            }
            #endregion

            #region Try get the reference then check for contracts
            IMethodReference cciMethod;
            if (TryGetMethodReference(semanticMethod, out cciMethod))
            {
                if (TryGetMethodContract(cciMethod, out methodContract))
                {
                    return(true);
                }
                else
                {
                    //No need, detailed logs are written at all code paths in "TryGetMethodContract"
                    //ContractsPackageAccessor.Current.Logger.WriteToLog("Failed to get method contracts for: " + cciMethod.Name);
                }
            }
            else
            {
                methodContract = null;
                if (semanticMethod.Name != null)
                {
                    ContractsPackageAccessor.Current.Logger.WriteToLog("Failed to get CCI reference for: " + semanticMethod.Name.Text);
                }
            }
            return(false);

            #endregion
        }
        public static bool TryGetBaseMember(CSharpMember member, out CSharpMember baseMember)
        {
            Contract.Requires(member != null);
            Contract.Ensures(!Contract.Result <bool>() ||
                             member.IsMethod == Contract.ValueAtReturn(out baseMember).IsMethod &&
                             member.IsProperty == Contract.ValueAtReturn(out baseMember).IsProperty &&
                             member.IsIndexer == Contract.ValueAtReturn(out baseMember).IsIndexer &&
                             member.IsField == Contract.ValueAtReturn(out baseMember).IsField);

            baseMember = null;

            if (member.ContainingType == null)
            {
                throw new IllFormedSemanticModelException("A CSharpMember (method) was found with a null 'ContainingType' field.", member);
            }
            if (!member.ContainingType.IsClass)
            {
                return(false);
            }
            var containingType = member.ContainingType;
            var baseClass      = containingType.BaseClass;

            while (baseClass != null)
            {
                if (TryGetMemberWithSameSignatureFromType(baseClass, member, out baseMember))
                {
                    Contract.Assume(
                        member.IsMethod == baseMember.IsMethod &&
                        member.IsProperty == baseMember.IsProperty &&
                        member.IsIndexer == baseMember.IsIndexer &&
                        member.IsField == baseMember.IsField);
                    return(true);
                }
                baseClass = baseClass.BaseClass;
            }
            return(false);
        }
Example #16
0
        static void RecursivelyLookupContractsForProperties(InheritanceTracker @this)
        {
            Contract.Requires(@this != null);

            #region Dequeue
            if (@this._propertiesNeedingContractLookup.Count < 1)
            {
                return;
            }
            var propertyPair = @this._propertiesNeedingContractLookup.Dequeue();
            var property     = propertyPair.Value;
            var tagTuple     = propertyPair.Key;
            #endregion
            try {
                var comp = @this._textViewTracker.LatestCompilation;
                if (comp == null)
                {
                    ContractsPackageAccessor.Current.Logger.WriteToLog("No LatestCompilation, waiting for a new semantic model.");
                    @this._textViewTracker.IsLatestCompilationStale = true;
                    Utilities.Delay(() => ContractsPackageAccessor.Current.AskForNewVSModel(), DelayOnVSModelFailedBeforeTryingAgain);
                    @this.semanticModelsFetchedCounter++;
                    goto RequeueAndAbort;
                }
                #region Get semantic property from syntactic property
                CSharpMember semanticProperty = null;
                semanticProperty = comp.GetMemberForPropertyDeclaration(property);
                if (semanticProperty == null)
                {
                    if (@this.trackingNumberOfFetchedSemanticModels && @this.semanticModelsFetchedCounter <= 3)
                    {
                        ContractsPackageAccessor.Current.Logger.WriteToLog("Failed to get semantic property from syntactic property, waiting for a new semantic model.");
                        @this._textViewTracker.IsLatestCompilationStale = true;
                        Utilities.Delay(() => ContractsPackageAccessor.Current.AskForNewVSModel(), DelayOnVSModelFailedBeforeTryingAgain);
                        @this.semanticModelsFetchedCounter++;
                        goto RequeueAndAbort;
                    }
                    else
                    {
                        ContractsPackageAccessor.Current.Logger.WriteToLog("Failed to get semantic property from syntactic property. Too many semantic models have already been fetched, skipping this property...");
                        goto Continue;
                    }
                }
                #endregion
                #region Try get the property that this property is inherited from
                CSharpMember inheritedFromProperty;
                if (!TryGetIheritedFromMember(semanticProperty, property.Parent as TypeDeclarationNode, out inheritedFromProperty))
                {
                    goto Continue;
                }
                #endregion
                #region Uninstantiated property
                semanticProperty = semanticProperty.Uninstantiate();
                #endregion
                #region Get our tool tip
                var toolTip = "";
                if (!semanticProperty.IsAbstract && !semanticProperty.ContainingType.IsInterface)
                {
                    toolTip = String.Format("Contracts inherited from {0}.", inheritedFromProperty.ContainingType.Name.Text);
                }
                #endregion
                #region Try get accessor contracts and update adornment
                IMethodReference getterReference = null;
                IMethodReference setterReference = null;
                if (((ContractsProvider)@this._textViewTracker.ProjectTracker.ContractsProvider).TryGetPropertyAccessorReferences(inheritedFromProperty, out getterReference, out setterReference))
                {
                    if (tagTuple.Item1 != null && getterReference != null)
                    {
                        IMethodContract getterContracts;
                        if (((ContractsProvider)@this._textViewTracker.ProjectTracker.ContractsProvider).TryGetMethodContract(getterReference, out getterContracts))
                        {
                            var possibleAdornment = @this._adornmentManager.GetAdornment(tagTuple.Item1);
                            if (possibleAdornment != null)
                            {
                                var adornment = possibleAdornment as ContractAdornment;
                                if (adornment != null)
                                {
                                    adornment.SetContracts(getterContracts, toolTip);
                                }
                                else
                                {
                                    ContractsPackageAccessor.Current.Logger.WriteToLog("Placeholder adornment isn't a ContractAdornment (not good!), skipping getter...");
                                }
                            }
                            else
                            {
                                ContractsPackageAccessor.Current.Logger.WriteToLog("Placeholder adornment not found, skipping getter...");
                            }
                        }
                    }
                    if (tagTuple.Item2 != null && setterReference != null)
                    {
                        IMethodContract setterContracts;
                        if (((ContractsProvider)@this._textViewTracker.ProjectTracker.ContractsProvider).TryGetMethodContract(setterReference, out setterContracts))
                        {
                            var possibleAdornment = @this._adornmentManager.GetAdornment(tagTuple.Item2);
                            if (possibleAdornment != null)
                            {
                                var adornment = possibleAdornment as ContractAdornment;
                                if (adornment != null)
                                {
                                    adornment.SetContracts(setterContracts, toolTip);
                                }
                                else
                                {
                                    ContractsPackageAccessor.Current.Logger.WriteToLog("Placeholder adornment isn't a ContractAdornment (not good!), skipping setter...");
                                }
                            }
                            else
                            {
                                ContractsPackageAccessor.Current.Logger.WriteToLog("Placeholder adornment not found, skipping setter...");
                            }
                        }
                    }
                }
                else
                {
                    ContractsPackageAccessor.Current.Logger.WriteToLog("Failed to get CCI reference for: " + inheritedFromProperty.Name.Text);
                }
                #endregion
            }
            #region Exception handeling
            catch (IllFormedSemanticModelException e) {
                if (@this.trackingNumberOfFetchedSemanticModels && @this.semanticModelsFetchedCounter <= 2)
                {
                    ContractsPackageAccessor.Current.Logger.WriteToLog("Error: An 'IllFormedSemanticModelException' occured: '" + e.Message + "' Asking for a new semantic model...");
                    @this._textViewTracker.IsLatestCompilationStale = true;
                    ContractsPackageAccessor.Current.AskForNewVSModel();
                    @this.semanticModelsFetchedCounter++;
                    goto RequeueAndAbort;
                }
                else
                {
                    ContractsPackageAccessor.Current.Logger.WriteToLog("An 'IllFormedSemanticModelException' occured: '" + e.Message + "' Too many semantic models have been fetched, skipping this property...");
                    goto Continue;
                }
            } catch (InvalidOperationException e) {
                if (e.Message.Contains(ContractsPackageAccessor.InvalidOperationExceptionMessage_TheSnapshotIsOutOfDate))
                {
                    if (@this.trackingNumberOfFetchedSemanticModels && @this.semanticModelsFetchedCounter <= 5)
                    {
                        ContractsPackageAccessor.Current.Logger.WriteToLog("The Visual Studio Semantic/Syntactic model threw an exception (it's snapshot is out of date) while looking up contracts, getting new compilation...");
                        @this._textViewTracker.IsLatestCompilationStale = true;
                        ContractsPackageAccessor.Current.AskForNewVSModel();
                        @this.semanticModelsFetchedCounter++;
                        goto RequeueAndAbort;
                    }
                    else
                    {
                        ContractsPackageAccessor.Current.Logger.WriteToLog("The Visual Studio Semantic/Syntactic model threw an exception (it's snapshot is out of date) while looking up contracts. Too many compilations have already been fetched, skipping this property...");
                        goto Continue;
                    }
                }
                else
                {
                    throw e;
                }
            } catch (COMException e) {
                if (e.Message.Contains(ContractsPackageAccessor.COMExceptionMessage_BindingFailed))
                {
                    if (@this.trackingNumberOfFetchedSemanticModels && @this.semanticModelsFetchedCounter <= 5)
                    {
                        ContractsPackageAccessor.Current.Logger.WriteToLog("The Visual Studio Semantic/Syntactic model threw an exception (it's snapshot is out of date) while looking up contracts, getting new compilation...");
                        @this._textViewTracker.IsLatestCompilationStale = true;
                        ContractsPackageAccessor.Current.AskForNewVSModel();
                        @this.semanticModelsFetchedCounter++;
                        goto RequeueAndAbort;
                    }
                    else
                    {
                        ContractsPackageAccessor.Current.Logger.WriteToLog("The Visual Studio Semantic/Syntactic model threw an exception (it's snapshot is out of date) while looking up contracts. Too many compilations have already been fetched, skipping this property...");
                        goto Continue;
                    }
                }
                else
                {
                    throw e;
                }
            }
            #endregion
Continue:
            ContractsPackageAccessor.Current.QueueWorkItem(() => RecursivelyLookupContractsForProperties(@this));
            return;

RequeueAndAbort:
            @this._propertiesNeedingContractLookup.Enqueue(propertyPair);
            return;
        }
Example #17
0
        private void FindHideBySigMethod(List <CSharpMember> results, CSharpType type, CSharpMember member, bool checkBaseTypes, bool includeInheritedInterfaces)
        {
            foreach (var potential in type.Members)
            {
                if (!member.IsSameSignature(potential))
                {
                    continue;
                }

                results.Add(potential);
            }

            if (checkBaseTypes)
            {
                CSharpType baseType = type.BaseClass;
                if (baseType != null)
                {
                    FindHideBySigMethod(results, baseType, member, checkBaseTypes, includeInheritedInterfaces);
                }
            }

            if (includeInheritedInterfaces)
            {
                IList <CSharpType> interfaces = type.BaseInterfaces;
                if (interfaces != null)
                {
                    foreach (CSharpType interfaceType in interfaces.OfType <CSharpType>())
                    {
                        FindHideBySigMethod(results, interfaceType, member, checkBaseTypes, includeInheritedInterfaces);
                    }
                }
            }
        }
Example #18
0
    public bool TryGetMethodContractSafe(CSharpMember semanticMehod, out IMethodContract methodContract) {
      Contract.Requires(semanticMehod == null || semanticMehod.IsMethod || semanticMehod.IsConstructor);
      Contract.Ensures(!Contract.Result<bool>() || (Contract.ValueAtReturn(out methodContract) != null));

      methodContract = null;

      #region Check input
      if (semanticMehod == null) {
        return false;
      }
      #endregion
      #region Call TryGetMethodContract cautiously
      try {
        //Can we get contracts?
        if (!TryGetMethodContract(semanticMehod, out methodContract))
          return false;
      }
      #endregion
      #region Abort on exception
        //Give up on our contracts if we get an exception
      catch (IllFormedSemanticModelException) {
        return false;
      } catch (InvalidOperationException e) {
        if (!e.Message.Contains(VSServiceProvider.InvalidOperationExceptionMessage_TheSnapshotIsOutOfDate))
          throw e;
        else
          return false;
      } catch (System.Runtime.InteropServices.COMException e) {
        if (!e.Message.Contains(VSServiceProvider.COMExceptionMessage_BindingFailed))
          throw e;
        else
          return false;
      }
      #endregion

      return methodContract != null;
    }
Example #19
0
    public bool TryGetMethodReference(CSharpMember semanticMethod, out IMethodReference cciMethod) {
      Contract.Requires(semanticMethod == null || semanticMethod.IsConstructor || semanticMethod.IsMethod);
      Contract.Ensures(!Contract.Result<bool>() || Contract.ValueAtReturn(out cciMethod) != null);

      cciMethod = null;

      #region Check input
      if (semanticMethod == null) {
        return false;
      }
      #endregion
      #region Check cache
      if (VSServiceProvider.Current.VSOptionsPage.Caching)
        if (_semanticMembersToCCIMethods.TryGetValue(semanticMethod, out cciMethod))
          return (!(cciMethod is Dummy)) && cciMethod != null;
      #endregion
      #region Set up our working cci method
      var workingCciMethod = new Microsoft.Cci.MutableCodeModel.MethodReference();
      #endregion
      #region Set the intern factory
      workingCciMethod.InternFactory = Host.InternFactory;
      #endregion
      #region Get calling conventions
      workingCciMethod.CallingConvention = CSharpToCCIHelper.GetCallingConventionFor(semanticMethod);
      #endregion
      #region Get containing type reference
      ITypeReference containingType;
      if (!TryGetTypeReference(semanticMethod.ContainingType, out containingType))
        goto ReturnFalse;
      workingCciMethod.ContainingType = containingType;
      #endregion
      #region Get return type reference
      if (semanticMethod.IsConstructor)
        workingCciMethod.Type = this.Host.PlatformType.SystemVoid;
      else {
        ITypeReference returnType;
        if (!TryGetTypeReference(semanticMethod.ReturnType, out returnType))
          goto ReturnFalse;
        workingCciMethod.Type = returnType;
      }
      #endregion
      #region Get name
      if (!semanticMethod.IsConstructor && semanticMethod.Name == null) goto ReturnFalse;
      workingCciMethod.Name = Host.NameTable.GetNameFor(semanticMethod.IsConstructor?".ctor":semanticMethod.Name.Text);
      #endregion
      #region Get generic param count
      if (semanticMethod.TypeParameters == null)
        workingCciMethod.GenericParameterCount = 0;
      else
        workingCciMethod.GenericParameterCount = (ushort)semanticMethod.TypeParameters.Count;
      #endregion
      #region Get parameter references
      List<IParameterTypeInformation> cciParameters;
      if (semanticMethod.Parameters == null) goto ReturnFalse;
      Contract.Assume(semanticMethod.Parameters.Count <= ushort.MaxValue, "Should be a postcondition?");
      if (!TryGetParametersList(semanticMethod.Parameters, out cciParameters))
        goto ReturnFalse;
      workingCciMethod.Parameters = cciParameters;
      #endregion
      #region Get the assembly reference (this also ensures the assembly gets loaded properly)
      IAssemblyReference assemblyReference;
      TryGetAssemblyReference(semanticMethod.Assembly, out assemblyReference);
      #endregion
      cciMethod = workingCciMethod;
      return true;
      #region ReturnFalse:
    ReturnFalse:
      cciMethod = Dummy.MethodReference;
      if (VSServiceProvider.Current.VSOptionsPage.Caching)
        _semanticMembersToCCIMethods[semanticMethod] = cciMethod;
      return false;
      #endregion
    }
Example #20
0
    public bool TryGetPropertyAccessorReferences(CSharpMember semanticProperty, out IMethodReference getter, out IMethodReference setter) {
      Contract.Requires(semanticProperty == null || semanticProperty.IsProperty || semanticProperty.IsIndexer);

      getter = setter = null;

      #region Check input
      if (semanticProperty == null) {
        return false;
      }
      #endregion
      #region Check cache
      Tuple<IMethodReference, IMethodReference> cacheOutput;
      if (_semanticPropertiesToCCIAccessorMethods.TryGetValue(semanticProperty, out cacheOutput)) {
        Contract.Assume(cacheOutput != null, "Non-null only dictionary");
        getter = cacheOutput.Item1;
        setter = cacheOutput.Item2;
        return (getter != null && getter != Dummy.MethodReference) || (setter != null && setter != Dummy.MethodReference);
      }
      #endregion
      #region Get calling conventions
      var callingConventions = CSharpToCCIHelper.GetCallingConventionFor(semanticProperty);
      #endregion
      #region get containing type
      ITypeReference containingType;
      if (!TryGetTypeReference(semanticProperty.ContainingType, out containingType))
        goto ReturnFalse;
      #endregion
      #region Get return type
      ITypeReference returnType;
      if (!TryGetTypeReference(semanticProperty.ReturnType, out returnType))
        goto ReturnFalse;
      #endregion
      #region Get the property's name
      string propertyName;
      if (semanticProperty.IsIndexer)
        propertyName = "Item";
      else
      {
        if (semanticProperty.Name == null) goto ReturnFalse;
        propertyName = semanticProperty.Name.Text;
      }
      #endregion
      #region Get the parameters
      List<IParameterTypeInformation> getterParams;
      if (semanticProperty.Parameters != null) {
        if (!TryGetParametersList(semanticProperty.Parameters, out getterParams))
          goto ReturnFalse;
      } else
        getterParams = new List<IParameterTypeInformation>();

      List<IParameterTypeInformation> setterParams;
      if (semanticProperty.Parameters != null) {
        if (!TryGetParametersList(semanticProperty.Parameters, out setterParams, 1))
          goto ReturnFalse;
        #region Append the "value" param
        var valParam = new Microsoft.Cci.MutableCodeModel.ParameterTypeInformation() {
          Type = returnType,
          Index = 0,
          IsByReference = false
        };
        setterParams.Insert(0, valParam);
        #endregion
      } else
        setterParams = new List<IParameterTypeInformation>();
      #endregion
      #region Build the getter
      getter = new Microsoft.Cci.MutableCodeModel.MethodReference() {
        InternFactory = Host.InternFactory,
        CallingConvention = callingConventions,
        ContainingType = containingType,
        Type = returnType,
        Name = Host.NameTable.GetNameFor("get_" + propertyName),
        GenericParameterCount = 0,
        Parameters = getterParams
      };
      #endregion
      #region Build the setter
      setter = new Microsoft.Cci.MutableCodeModel.MethodReference() {
        InternFactory = Host.InternFactory,
        CallingConvention = callingConventions,
        ContainingType = containingType,
        Type = Host.PlatformType.SystemVoid,
        Name = Host.NameTable.GetNameFor("set_" + propertyName),
        GenericParameterCount = 0,
        Parameters = setterParams
      };
      #endregion
      #region Get the assembly reference (this also ensures the assembly gets loaded properly)
      IAssemblyReference assemblyReference;
      TryGetAssemblyReference(semanticProperty.Assembly, out assemblyReference);
      #endregion
      #region ReturnTrue:
    //ReturnTrue:
      _semanticPropertiesToCCIAccessorMethods[semanticProperty] = new Tuple<IMethodReference, IMethodReference>(getter, setter);
      return true;
      #endregion
      #region ReturnFalse:
    ReturnFalse:
      if (semanticProperty.Name != null)
      {
        VSServiceProvider.Current.Logger.WriteToLog("Failed to build accessor references for: " + semanticProperty.Name.Text);
      }
      _semanticPropertiesToCCIAccessorMethods[semanticProperty] = new Tuple<IMethodReference, IMethodReference>(Dummy.MethodReference, Dummy.MethodReference);
      return false;
      #endregion
    }
 public static bool MembersAreEquivalent(CSharpMember member1, CSharpMember member2)
 {
     Contract.Requires(member1 != null);
     Contract.Requires(member2 != null);
     #region Check kind
     if (member1.IsProperty ^ member2.IsProperty)
     {
         return(false);
     }
     if (member1.IsMethod ^ member2.IsMethod)
     {
         return(false);
     }
     if (member1.IsField ^ member2.IsField)
     {
         return(false);
     }
     if (member1.IsIndexer ^ member2.IsIndexer)
     {
         return(false);
     }
     #endregion
     #region Check name
     if (member1.Name == null ^ member2.Name == null)
     {
         return(false);
     }
     if (member1.Name != null && member2.Name != null &&
         !member1.Name.Equals(member2.Name))
     {
         return(false);
     }
     #endregion
     #region Check explicit interface implementation
     if (member1.ExplicitInterfaceImplementation != null ^ member2.ExplicitInterfaceImplementation != null)
     {
         return(false);
     }
     if (member1.ExplicitInterfaceImplementation != null && member2.ExplicitInterfaceImplementation != null &&
         !TypesAreEquivalent(member1.ExplicitInterfaceImplementation, member2.ExplicitInterfaceImplementation))
     {
         return(false);
     }
     #endregion
     #region Check parameters
     if (member1.Parameters == null ^ member2.Parameters == null)
     {
         return(false);
     }
     if (member1.Parameters != null && member2.Parameters != null &&
         !ParameterListsAreEquivalent(member1.Parameters, member2.Parameters))
     {
         return(false);
     }
     #endregion
     #region Check return type
     if (member1.ReturnType == null)
     {
         throw new IllFormedSemanticModelException("A CSharpMember (member) was found with a null 'ReturnType' field.", member1);
     }
     if (member2.ReturnType == null)
     {
         throw new IllFormedSemanticModelException("A CSharpMember (member) was found with a null 'ReturnType' field.", member2);
     }
     if (!TypesAreEquivalent(member1.ReturnType, member2.ReturnType))
     {
         return(false);
     }
     #endregion
     return(true);
 }
Example #22
0
 internal RuntimeFieldInfo(CSharpMember member)
 {
     this.member = member;
 }
Example #23
0
 /*
  * 调用实现
  * 1. 穷举所有类型所有成员的调用
  * 优:各语言通用,不依赖语言支持反射的变式实现,执行速度快
  * 劣:生成代码多(引用优化和手动添加反射标签,应该也不会太多)
  */
 [ANonOptimize][AInvariant] public extern static object Invoke(CSharpMember member, object obj, object[] args);
        static void RecursivelyLookupContractsForMethods(InheritanceTracker @this)
        {
            Contract.Requires(@this != null);

            #region Dequeue
            if (@this._methodsNeedingContractLookup.Count < 1)
            {
                return;
            }
            var methodPair = @this._methodsNeedingContractLookup.Dequeue();
            var method     = methodPair.Value;
            var tag        = methodPair.Key;
            #endregion
            try {
                VSServiceProvider.Current.Logger.WriteToLog(String.Format("Attempting to lookup contracts for '{0}'", tag.ToString()));
                var comp = @this._textViewTracker.LatestCompilation;
                if (comp == null)
                {
                    VSServiceProvider.Current.Logger.WriteToLog("No LatestCompilation, waiting for a new semantic model.");
                    @this._textViewTracker.IsLatestCompilationStale = true;
                    Utilities.Delay(() => VSServiceProvider.Current.AskForNewVSModel(), DelayOnVSModelFailedBeforeTryingAgain);
                    @this.semanticModelsFetchedCounter++;
                    goto RequeueAndAbort;
                }
                #region Get semantic method from syntactic method
                CSharpMember semanticMethod = null;
                semanticMethod = comp.GetMemberForMethodDeclaration(method);
                if (semanticMethod == null)
                {
                    if (@this.trackingNumberOfFetchedSemanticModels && @this.semanticModelsFetchedCounter <= 3)
                    {
                        VSServiceProvider.Current.Logger.WriteToLog("Failed to get semantic method from syntactic method, waiting for a new semantic model.");
                        @this._textViewTracker.IsLatestCompilationStale = true;
                        Utilities.Delay(() => VSServiceProvider.Current.AskForNewVSModel(), DelayOnVSModelFailedBeforeTryingAgain);
                        @this.semanticModelsFetchedCounter++;
                        goto RequeueAndAbort;
                    }
                    else
                    {
                        VSServiceProvider.Current.Logger.WriteToLog("Failed to get semantic method from syntactic method. Too many semantic models have already been fetched, skipping this method...");
                        goto Continue;
                    }
                }
                #endregion
                #region Try get the method that this method is inherited from
                CSharpMember inheritedFromMethod;
                if (!TryGetIheritedFromMember(semanticMethod, method.Parent as TypeDeclarationNode, out inheritedFromMethod))
                {
                    goto Continue;
                }
                #endregion
                #region Uninstantiated method
                semanticMethod = semanticMethod.Uninstantiate();
                #endregion
                #region Get our tool tip
                var toolTip = "";
                if (!semanticMethod.IsAbstract && !semanticMethod.ContainingType.IsInterface)
                {
                    toolTip = String.Format("Contracts inherited from {0}.", inheritedFromMethod.ContainingType.Name.Text);
                }
                #endregion
                #region Try get method contracts and update adornment
                IMethodContract contracts = null;
                if (@this._textViewTracker.ProjectTracker.ContractsProvider.TryGetMethodContract(inheritedFromMethod, out contracts))
                {
                    var possibleAdornment = @this._adornmentManager.GetAdornment(tag);
                    if (possibleAdornment != null)
                    {
                        var adornment = possibleAdornment as ContractAdornment;
                        if (adornment != null)
                        {
                            adornment.SetContracts(contracts, toolTip);
                        }
                        else
                        {
                            VSServiceProvider.Current.Logger.WriteToLog("Placeholder adornment isn't a ContractAdornment (not good!), skipping method...");
                        }
                    }
                    else
                    {
                        VSServiceProvider.Current.Logger.WriteToLog("Placeholder adornment not found, skipping method...");
                    }
                }
                #endregion
            }
            #region Exception handeling
            catch (IllFormedSemanticModelException e) {
                if (@this.trackingNumberOfFetchedSemanticModels && @this.semanticModelsFetchedCounter <= 2)
                {
                    VSServiceProvider.Current.Logger.WriteToLog("Error: An 'IllFormedSemanticModelException' occured: '" + e.Message + "' Asking for a new semantic model...");
                    @this._textViewTracker.IsLatestCompilationStale = true;
                    VSServiceProvider.Current.AskForNewVSModel();
                    @this.semanticModelsFetchedCounter++;
                    goto RequeueAndAbort;
                }
                else
                {
                    VSServiceProvider.Current.Logger.WriteToLog("An 'IllFormedSemanticModelException' occured: '" + e.Message + "' Too many semantic models have been fetched, skipping this method...");
                    goto Continue;
                }
            } catch (InvalidOperationException e) {
                if (e.Message.Contains(VSServiceProvider.InvalidOperationExceptionMessage_TheSnapshotIsOutOfDate))
                {
                    if (@this.trackingNumberOfFetchedSemanticModels && @this.semanticModelsFetchedCounter <= 5)
                    {
                        VSServiceProvider.Current.Logger.WriteToLog("The Visual Studio Semantic/Syntactic model threw an exception (it's snapshot is out of date) while looking up contracts, getting new compilation...");
                        @this._textViewTracker.IsLatestCompilationStale = true;
                        VSServiceProvider.Current.AskForNewVSModel();
                        @this.semanticModelsFetchedCounter++;
                        goto RequeueAndAbort;
                    }
                    else
                    {
                        VSServiceProvider.Current.Logger.WriteToLog("The Visual Studio Semantic/Syntactic model threw an exception (it's snapshot is out of date) while looking up contracts. Too many compilations have already been fetched, skipping this method...");
                        goto Continue;
                    }
                }
                else
                {
                    throw e;
                }
            } catch (COMException e) {
                if (e.Message.Contains(VSServiceProvider.COMExceptionMessage_BindingFailed))
                {
                    if (@this.trackingNumberOfFetchedSemanticModels && @this.semanticModelsFetchedCounter <= 5)
                    {
                        VSServiceProvider.Current.Logger.WriteToLog("The Visual Studio Semantic/Syntactic model threw an exception (it's snapshot is out of date) while looking up contracts, getting new compilation...");
                        @this._textViewTracker.IsLatestCompilationStale = true;
                        VSServiceProvider.Current.AskForNewVSModel();
                        @this.semanticModelsFetchedCounter++;
                        goto RequeueAndAbort;
                    }
                    else
                    {
                        VSServiceProvider.Current.Logger.WriteToLog("The Visual Studio Semantic/Syntactic model threw an exception (it's snapshot is out of date) while looking up contracts. Too many compilations have already been fetched, skipping this method...");
                        goto Continue;
                    }
                }
                else
                {
                    throw e;
                }
            }
            #endregion
Continue:
            VSServiceProvider.Current.QueueWorkItem(() => RecursivelyLookupContractsForMethods(@this));
            return;

RequeueAndAbort:
            @this._methodsNeedingContractLookup.Enqueue(methodPair);
            return;
        }
Example #25
0
        public bool TryGetPropertyAccessorReferences(CSharpMember semanticProperty, out IMethodReference getter, out IMethodReference setter)
        {
            Contract.Requires(semanticProperty == null || semanticProperty.IsProperty || semanticProperty.IsIndexer);

            getter = setter = null;

            #region Check input
            if (semanticProperty == null)
            {
                return(false);
            }
            #endregion
            #region Check cache
            Tuple <IMethodReference, IMethodReference> cacheOutput;
            if (_semanticPropertiesToCCIAccessorMethods.TryGetValue(semanticProperty, out cacheOutput))
            {
                Contract.Assume(cacheOutput != null, "Non-null only dictionary");
                getter = cacheOutput.Item1;
                setter = cacheOutput.Item2;
                return((getter != null && getter != Dummy.MethodReference) || (setter != null && setter != Dummy.MethodReference));
            }
            #endregion
            #region Get calling conventions
            var callingConventions = CSharpToCCIHelper.GetCallingConventionFor(semanticProperty);
            #endregion
            #region get containing type
            ITypeReference containingType;
            if (!TryGetTypeReference(semanticProperty.ContainingType, out containingType))
            {
                goto ReturnFalse;
            }
            #endregion
            #region Get return type
            ITypeReference returnType;
            if (!TryGetTypeReference(semanticProperty.ReturnType, out returnType))
            {
                goto ReturnFalse;
            }
            #endregion
            #region Get the property's name
            string propertyName;
            if (semanticProperty.IsIndexer)
            {
                propertyName = "Item";
            }
            else
            {
                if (semanticProperty.Name == null)
                {
                    goto ReturnFalse;
                }
                propertyName = semanticProperty.Name.Text;
            }
            #endregion
            #region Get the parameters
            List <IParameterTypeInformation> getterParams;
            if (semanticProperty.Parameters != null)
            {
                if (!TryGetParametersList(semanticProperty.Parameters, out getterParams))
                {
                    goto ReturnFalse;
                }
            }
            else
            {
                getterParams = new List <IParameterTypeInformation>();
            }

            List <IParameterTypeInformation> setterParams;
            if (semanticProperty.Parameters != null)
            {
                if (!TryGetParametersList(semanticProperty.Parameters, out setterParams, 1))
                {
                    goto ReturnFalse;
                }
                #region Append the "value" param
                var valParam = new Microsoft.Cci.MutableCodeModel.ParameterTypeInformation()
                {
                    Type          = returnType,
                    Index         = 0,
                    IsByReference = false
                };
                setterParams.Insert(0, valParam);
                #endregion
            }
            else
            {
                setterParams = new List <IParameterTypeInformation>();
            }
            #endregion
            #region Build the getter
            getter = new Microsoft.Cci.MutableCodeModel.MethodReference()
            {
                InternFactory     = Host.InternFactory,
                CallingConvention = callingConventions,
                ContainingType    = containingType,
                Type = returnType,
                Name = Host.NameTable.GetNameFor("get_" + propertyName),
                GenericParameterCount = 0,
                Parameters            = getterParams
            };
            #endregion
            #region Build the setter
            setter = new Microsoft.Cci.MutableCodeModel.MethodReference()
            {
                InternFactory     = Host.InternFactory,
                CallingConvention = callingConventions,
                ContainingType    = containingType,
                Type = Host.PlatformType.SystemVoid,
                Name = Host.NameTable.GetNameFor("set_" + propertyName),
                GenericParameterCount = 0,
                Parameters            = setterParams
            };
            #endregion
            #region Get the assembly reference (this also ensures the assembly gets loaded properly)
            IAssemblyReference assemblyReference;
            TryGetAssemblyReference(semanticProperty.Assembly, out assemblyReference);
            #endregion
            #region ReturnTrue:
            //ReturnTrue:
            _semanticPropertiesToCCIAccessorMethods[semanticProperty] = new Tuple <IMethodReference, IMethodReference>(getter, setter);
            return(true);

            #endregion
            #region ReturnFalse:
ReturnFalse:
            if (semanticProperty.Name != null)
            {
                ContractsPackageAccessor.Current.Logger.WriteToLog("Failed to build accessor references for: " + semanticProperty.Name.Text);
            }
            _semanticPropertiesToCCIAccessorMethods[semanticProperty] = new Tuple <IMethodReference, IMethodReference>(Dummy.MethodReference, Dummy.MethodReference);
            return(false);

            #endregion
        }
Example #26
0
        public bool TryGetMethodReference(CSharpMember semanticMethod, out IMethodReference cciMethod)
        {
            Contract.Requires(semanticMethod == null || semanticMethod.IsConstructor || semanticMethod.IsMethod);
            Contract.Ensures(!Contract.Result <bool>() || Contract.ValueAtReturn(out cciMethod) != null);

            cciMethod = null;

            #region Check input
            if (semanticMethod == null)
            {
                return(false);
            }
            #endregion
            #region Check cache
            if (ContractsPackageAccessor.Current.VSOptionsPage.Caching)
            {
                if (_semanticMembersToCCIMethods.TryGetValue(semanticMethod, out cciMethod))
                {
                    return((!(cciMethod is Dummy)) && cciMethod != null);
                }
            }
            #endregion
            #region Set up our working cci method
            var workingCciMethod = new Microsoft.Cci.MutableCodeModel.MethodReference();
            #endregion
            #region Set the intern factory
            workingCciMethod.InternFactory = Host.InternFactory;
            #endregion
            #region Get calling conventions
            workingCciMethod.CallingConvention = CSharpToCCIHelper.GetCallingConventionFor(semanticMethod);
            #endregion
            #region Get containing type reference
            ITypeReference containingType;
            if (!TryGetTypeReference(semanticMethod.ContainingType, out containingType))
            {
                goto ReturnFalse;
            }
            workingCciMethod.ContainingType = containingType;
            #endregion
            #region Get return type reference
            if (semanticMethod.IsConstructor)
            {
                workingCciMethod.Type = this.Host.PlatformType.SystemVoid;
            }
            else
            {
                ITypeReference returnType;
                if (!TryGetTypeReference(semanticMethod.ReturnType, out returnType))
                {
                    goto ReturnFalse;
                }
                workingCciMethod.Type = returnType;
            }
            #endregion
            #region Get name
            if (!semanticMethod.IsConstructor && semanticMethod.Name == null)
            {
                goto ReturnFalse;
            }
            workingCciMethod.Name = Host.NameTable.GetNameFor(semanticMethod.IsConstructor?".ctor":semanticMethod.Name.Text);
            #endregion
            #region Get generic param count
            if (semanticMethod.TypeParameters == null)
            {
                workingCciMethod.GenericParameterCount = 0;
            }
            else
            {
                workingCciMethod.GenericParameterCount = (ushort)semanticMethod.TypeParameters.Count;
            }
            #endregion
            #region Get parameter references
            List <IParameterTypeInformation> cciParameters;
            if (semanticMethod.Parameters == null)
            {
                goto ReturnFalse;
            }
            Contract.Assume(semanticMethod.Parameters.Count <= ushort.MaxValue, "Should be a postcondition?");
            if (!TryGetParametersList(semanticMethod.Parameters, out cciParameters))
            {
                goto ReturnFalse;
            }
            workingCciMethod.Parameters = cciParameters;
            #endregion
            #region Get the assembly reference (this also ensures the assembly gets loaded properly)
            IAssemblyReference assemblyReference;
            TryGetAssemblyReference(semanticMethod.Assembly, out assemblyReference);
            #endregion
            cciMethod = workingCciMethod;
            return(true);

            #region ReturnFalse:
ReturnFalse:
            cciMethod = Dummy.MethodReference;
            if (ContractsPackageAccessor.Current.VSOptionsPage.Caching)
            {
                _semanticMembersToCCIMethods[semanticMethod] = cciMethod;
            }
            return(false);

            #endregion
        }
Example #27
0
    public bool TryGetMethodContract(CSharpMember semanticMethod, out IMethodContract methodContract)
    {
      Contract.Requires(semanticMethod == null || semanticMethod.IsConstructor || semanticMethod.IsMethod);
      Contract.Ensures(!Contract.Result<bool>() || (Contract.ValueAtReturn(out methodContract) != null));

      methodContract = null;

      #region Check input
      if (semanticMethod == null) {
        return false;
      }
      #endregion

      #region Try get the reference then check for contracts
      IMethodReference cciMethod;
      if (TryGetMethodReference(semanticMethod, out cciMethod)) {
        if (TryGetMethodContract(cciMethod, out methodContract)) {
          return true;
        } else {
          //No need, detailed logs are written at all code paths in "TryGetMethodContract"
          //VSServiceProvider.Current.Logger.WriteToLog("Failed to get method contracts for: " + cciMethod.Name);
        }
      } else {
        methodContract = null;
        if (semanticMethod.Name != null)
        {
          VSServiceProvider.Current.Logger.WriteToLog("Failed to get CCI reference for: " + semanticMethod.Name.Text);
        }
      }
      return false;
      #endregion
    }
Example #28
0
 internal RuntimeConstructorInfo(CSharpMember member)
 {
     this.member = member;
 }
    static bool TryGetIheritedFromMember(CSharpMember semanticMember, TypeDeclarationNode syntacticParentType, out CSharpMember inheritedFromMember) {
      Contract.Requires(semanticMember != null);
      Contract.Requires(semanticMember.IsMethod);
      Contract.Ensures(!Contract.Result<bool>() || 
                       Contract.ValueAtReturn(out inheritedFromMember) != null && 
                       Contract.ValueAtReturn(out inheritedFromMember).IsMethod);

      inheritedFromMember = null;
      #region If member is from struct, ignore it
      if (semanticMember.ContainingType.IsValueType || semanticMember.ContainingType.IsStruct) {
        ContractsPackageAccessor.Current.Logger.WriteToLog("Member is struct or value type, skipping member...");
        return false;
      }
      #endregion
      #region If member is from a contract class, ignore it
      //TODO: Get proper attributes from semantic model! Bug in semantic model, custom attributes don't seem to work right.
      bool ignoreIt = false;
      var containingType = semanticMember.ContainingType;
      if (containingType.IsClass) {
        if (syntacticParentType != null) {
          foreach (var attributeSection in syntacticParentType.Attributes) {
            foreach (var attribute in attributeSection.AttributeList) {
              var attributeName = attribute.AttributeName as IdentifierNode;
              if (attributeName != null) {
                if (attributeName.Name.Text.Contains("ContractClassFor"))
                  ignoreIt = true;
              }
            }
          }
        }
      }
      if (ignoreIt) {
        ContractsPackageAccessor.Current.Logger.WriteToLog("Member has 'ContractClassForAttribute', skipping member...");
        return false;
      }
      #endregion
      // If member is override, get base member
      if (semanticMember.IsOverride) {
        if (!CSharpToCCIHelper.TryGetBaseMember(semanticMember, out inheritedFromMember)) {
          ContractsPackageAccessor.Current.Logger.WriteToLog("Member is an override but we can't get its base member, skipping member...");
          return false; //If we can't get the base member, we don't want to keep going with this member.
        }
      }
      else if (semanticMember.ContainingType.IsInterface || semanticMember.IsAbstract)
      {
        inheritedFromMember = semanticMember;
      }
      #region Else member implements an interface or it doesn't have inherited contracts, get interface member
      else
      {
        if (!CSharpToCCIHelper.TryGetInterfaceMember(semanticMember, out inheritedFromMember))
        {
          ContractsPackageAccessor.Current.Logger.WriteToLog("Member isn't override, abstract, in an interface or an interface member, skipping member...");
          return false; //If we can't get the interface member, we don't want to keep going with this member.
        }
      }
      #endregion
      return inheritedFromMember != null;
    }
Example #30
0
        static bool TryGetIheritedFromMember(CSharpMember semanticMember, TypeDeclarationNode syntacticParentType, out CSharpMember inheritedFromMember)
        {
            Contract.Requires(semanticMember != null);
            Contract.Requires(semanticMember.IsMethod);
            Contract.Ensures(!Contract.Result <bool>() ||
                             Contract.ValueAtReturn(out inheritedFromMember) != null &&
                             Contract.ValueAtReturn(out inheritedFromMember).IsMethod);

            inheritedFromMember = null;
            #region If member is from struct, ignore it
            if (semanticMember.ContainingType.IsValueType || semanticMember.ContainingType.IsStruct)
            {
                ContractsPackageAccessor.Current.Logger.WriteToLog("Member is struct or value type, skipping member...");
                return(false);
            }
            #endregion
            #region If member is from a contract class, ignore it
            //TODO: Get proper attributes from semantic model! Bug in semantic model, custom attributes don't seem to work right.
            bool ignoreIt       = false;
            var  containingType = semanticMember.ContainingType;
            if (containingType.IsClass)
            {
                if (syntacticParentType != null)
                {
                    foreach (var attributeSection in syntacticParentType.Attributes)
                    {
                        foreach (var attribute in attributeSection.AttributeList)
                        {
                            var attributeName = attribute.AttributeName as IdentifierNode;
                            if (attributeName != null)
                            {
                                if (attributeName.Name.Text.Contains("ContractClassFor"))
                                {
                                    ignoreIt = true;
                                }
                            }
                        }
                    }
                }
            }
            if (ignoreIt)
            {
                ContractsPackageAccessor.Current.Logger.WriteToLog("Member has 'ContractClassForAttribute', skipping member...");
                return(false);
            }
            #endregion
            // If member is override, get base member
            if (semanticMember.IsOverride)
            {
                if (!CSharpToCCIHelper.TryGetBaseMember(semanticMember, out inheritedFromMember))
                {
                    ContractsPackageAccessor.Current.Logger.WriteToLog("Member is an override but we can't get its base member, skipping member...");
                    return(false); //If we can't get the base member, we don't want to keep going with this member.
                }
            }
            else if (semanticMember.ContainingType.IsInterface || semanticMember.IsAbstract)
            {
                inheritedFromMember = semanticMember;
            }
            #region Else member implements an interface or it doesn't have inherited contracts, get interface member
            else
            {
                if (!CSharpToCCIHelper.TryGetInterfaceMember(semanticMember, out inheritedFromMember))
                {
                    ContractsPackageAccessor.Current.Logger.WriteToLog("Member isn't override, abstract, in an interface or an interface member, skipping member...");
                    return(false); //If we can't get the interface member, we don't want to keep going with this member.
                }
            }
            #endregion
            return(inheritedFromMember != null);
        }
Example #31
0
    private string GetFormattedContracts(CSharpMember semanticMember)
    {
        Contract.Requires(semanticMember != null);
        Contract.Requires(semanticMember.IsMethod || semanticMember.IsConstructor || semanticMember.IsProperty || semanticMember.IsIndexer);

        if (semanticMember.IsProperty || semanticMember.IsIndexer)
        {
            IMethodContract setter, getter;
            if (!((ContractsProvider)_textViewTracker.ProjectTracker.ContractsProvider).TryGetPropertyContract(semanticMember, out getter, out setter))
            {
                return null;
            }
            return IntellisenseContractsHelper.FormatPropertyContracts(getter, setter);
        }

        //Can we get our contracts?
        IMethodContract methodContracts;
        if (!((ContractsProvider)_textViewTracker.ProjectTracker.ContractsProvider).TryGetMethodContract(semanticMember, out methodContracts))
            return null;

        //Can we get our formatted contracts?
        return IntellisenseContractsHelper.FormatContracts(methodContracts);
    }
 public static new bool IsSupportedMemberType(CSharpMember member)
 {
     return(MatchingMemberCollector.IsSupportedMemberType(member));
 }
Example #33
0
 internal RuntimePropertyInfo(CSharpMember member)
 {
     this.member = member;
 }
 public static new bool IsSupportedMemberType(CSharpMember member)
 {
     return MatchingMemberCollector.IsSupportedMemberType(member);
 }
Example #35
0
 internal RuntimeMethodInfo(CSharpMember member)
 {
     this.member = member;
 }
Example #36
0
    public bool TryGetPropertyContract(CSharpMember semanticMember, out IMethodContract getterContract, out IMethodContract setterContract)
    {
        Contract.Requires(semanticMember == null || semanticMember.IsProperty || semanticMember.IsIndexer);

        getterContract = null;
        setterContract = null;

        #region Check input
        if (semanticMember == null)
        {
            return false;
        }
        #endregion
        IMethodReference getter, setter;
        if (!TryGetPropertyAccessorReferences(semanticMember, out getter, out setter)) { return false; }

        var success = false;
        if (getter != null)
        {
            success |= TryGetMethodContract(getter, out getterContract);
        }
        if (setter != null)
        {
            success |= TryGetMethodContract(setter, out setterContract);
        }
        return success;
    }