private object ReadEntitySpec()

in ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Metadata/FSharpMetadataReader.cs [272:332]


    private object ReadEntitySpec()
    {
      Interruption.Current.CheckAndThrow();

      var index = ReadPackedInt();
      var typeParameters = ReadArray(reader => reader.ReadTypeParameterSpec());
      var logicalName = ReadUniqueString();
      var compiledName = ReadOption(ReadUniqueStringFunc);
      var range = ReadRange();
      var publicPath = ReadOption(reader => reader.ReadPublicPath());
      var accessibility = ReadAccessibility();
      var representationAccessibility = ReadAccessibility();
      var attributes = ReadAttributes();
      var typeRepresentationFunc = ReadTypeRepresentation();
      var typeAbbreviation = ReadOption(ReadTypeFunc);
      var typeAugmentation = ReadTypeAugmentation();
      var xmlDocId = ReadUniqueString(); // Should be an empty string.
      var typeKind = ReadTypeKind();
      var flags = (EntityFlags) ReadInt64();

      var entityFlags = flags & ~EntityFlags.ReservedBit;
      var isModuleOrNamespace = (entityFlags & EntityFlags.IsModuleOrNamespace) != 0;
      var reprIsProvidedIlType = flags & EntityFlags.ReservedBit;

      var compilationPathWithScopeRef = ReadOption(reader => reader.ReadCompilationPath());
      var compilationPath = compilationPathWithScopeRef?.Value is var (_, path) ? path : [];

      var accessRights = GetAccessRights(accessibility);

      var entity = FSharpMetadataEntityModule.create(index, logicalName, compiledName, typeParameters.Length, compilationPath, accessRights);
      myState.Push(entity);
      Metadata.Entities[index] = entity;

      var metadataValues = ReadModuleType(entity);
      var exceptionRepresentation = ReadExceptionRepresentation();
      var possibleXmlDoc = ReadPossibleXmlDoc();

      var typeRepresentation = typeRepresentationFunc(reprIsProvidedIlType != 0);

      if (isModuleOrNamespace)
      {
        if (entity.EntityKind != EntityKind.Namespace)
        {
          var nameKind = GetModuleNameKind(entity.EntityKind, range);
          entity.Representation = FSharpCompiledTypeRepresentation.NewModule(nameKind, metadataValues);
          Metadata.AddEntity(entity, myMetadataAssembly);
        }
      }
      else
      {
        if (typeAbbreviation == null)
        {
          entity.Representation = typeRepresentation;
          Metadata.AddEntity(entity, myMetadataAssembly);
        }
      }

      myState.Pop();

      return null;
    }