parameters: (self, writer=gyp.common.WriteOnDiff)
docstring: Writes the solution file to disk.
  
      Raises:
        IndexError: An entry appears multiple times.
docstring_summary: Writes the solution file to disk.
docstring_tokens: Writes the solution file to disk .
function: def Write(self, writer=gyp.common.WriteOnDiff):
      """Writes the solution file to disk.
  
      Raises:
        IndexError: An entry appears multiple times.
      """
      # Walk the entry tree and collect all the folders and projects.
      all_entries = set()
      entries_to_check = self.entries[:]
      while entries_to_check:
        e = entries_to_check.pop(0)
  
        # If this entry has been visited, nothing to do.
        if e in all_entries:
          continue
  
        all_entries.add(e)
  
        # If this is a folder, check its entries too.
        if isinstance(e, MSVSFolder):
          entries_to_check += e.entries
  
      all_entries = sorted(all_entries)
  
      # Open file and print header
      f = writer(self.path)
      f.write('Microsoft Visual Studio Solution File, '
              'Format Version %s\r\n' % self.version.SolutionVersion())
      f.write('# %s\r\n' % self.version.Description())
  
      # Project entries
      sln_root = os.path.split(self.path)[0]
      for e in all_entries:
        relative_path = gyp.common.RelativePath(e.path, sln_root)
        # msbuild does not accept an empty folder_name.
        # use '.' in case relative_path is empty.
        folder_name = relative_path.replace('/', '\\') or '.'
        f.write('Project("%s") = "%s", "%s", "%s"\r\n' % (
            e.entry_type_guid,          # Entry type GUID
            e.name,                     # Folder name
            folder_name,                # Folder name (again)
            e.get_guid(),               # Entry GUID
        ))
  
        # TODO(rspangler): Need a way to configure this stuff
        if self.websiteProperties:
          f.write('\tProjectSection(WebsiteProperties) = preProject\r\n'
                  '\t\tDebug.AspNetCompiler.Debug = "True"\r\n'
                  '\t\tRelease.AspNetCompiler.Debug = "False"\r\n'
                  '\tEndProjectSection\r\n')
  
        if isinstance(e, MSVSFolder):
          if e.items:
            f.write('\tProjectSection(SolutionItems) = preProject\r\n')
            for i in e.items:
              f.write('\t\t%s = %s\r\n' % (i, i))
            f.write('\tEndProjectSection\r\n')
  
        if isinstance(e, MSVSProject):
          if e.dependencies:
            f.write('\tProjectSection(ProjectDependencies) = postProject\r\n')
            for d in e.dependencies:
              f.write('\t\t%s = %s\r\n' % (d.get_guid(), d.get_guid()))
            f.write('\tEndProjectSection\r\n')
  
        f.write('EndProject\r\n')
  
      # Global section
      f.write('Global\r\n')
  
      # Configurations (variants)
      f.write('\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n')
      for v in self.variants:
        f.write('\t\t%s = %s\r\n' % (v, v))
      f.write('\tEndGlobalSection\r\n')
  
      # Sort config guids for easier diffing of solution changes.
      config_guids = []
      config_guids_overrides = {}
      for e in all_entries:
        if isinstance(e, MSVSProject):
          config_guids.append(e.get_guid())
          config_guids_overrides[e.get_guid()] = e.config_platform_overrides
      config_guids.sort()
  
      f.write('\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n')
      for g in config_guids:
        for v in self.variants:
          nv = config_guids_overrides[g].get(v, v)
          # Pick which project configuration to build for this solution
          # configuration.
          f.write('\t\t%s.%s.ActiveCfg = %s\r\n' % (
              g,              # Project GUID
              v,              # Solution build configuration
              nv,             # Project build config for that solution config
          ))
  
          # Enable project in this solution configuration.
          f.write('\t\t%s.%s.Build.0 = %s\r\n' % (
              g,              # Project GUID
              v,              # Solution build configuration
              nv,             # Project build config for that solution config
          ))
      f.write('\tEndGlobalSection\r\n')
  
      # TODO(rspangler): Should be able to configure this stuff too (though I've
      # never seen this be any different)
      f.write('\tGlobalSection(SolutionProperties) = preSolution\r\n')
      f.write('\t\tHideSolutionNode = FALSE\r\n')
      f.write('\tEndGlobalSection\r\n')
  
      # Folder mappings
      # Omit this section if there are no folders
      if any([e.entries for e in all_entries if isinstance(e, MSVSFolder)]):
        f.write('\tGlobalSection(NestedProjects) = preSolution\r\n')
        for e in all_entries:
          if not isinstance(e, MSVSFolder):
            continue        # Does not apply to projects, only folders
          for subentry in e.entries:
            f.write('\t\t%s = %s\r\n' % (subentry.get_guid(), e.get_guid()))
        f.write('\tEndGlobalSection\r\n')
  
      f.write('EndGlobal\r\n')
  
      f.close()
function_tokens: def Write ( self , writer = gyp . common . WriteOnDiff ) : # Walk the entry tree and collect all the folders and projects. all_entries = set ( ) entries_to_check = self . entries [ : ] while entries_to_check : e = entries_to_check . pop ( 0 ) # If this entry has been visited, nothing to do. if e in all_entries : continue all_entries . add ( e ) # If this is a folder, check its entries too. if isinstance ( e , MSVSFolder ) : entries_to_check += e . entries all_entries = sorted ( all_entries ) # Open file and print header f = writer ( self . path ) f . write ( 'Microsoft Visual Studio Solution File, ' 'Format Version %s\r\n' % self . version . SolutionVersion ( ) ) f . write ( '# %s\r\n' % self . version . Description ( ) ) # Project entries sln_root = os . path . split ( self . path ) [ 0 ] for e in all_entries : relative_path = gyp . common . RelativePath ( e . path , sln_root ) # msbuild does not accept an empty folder_name. # use '.' in case relative_path is empty. folder_name = relative_path . replace ( '/' , '\\' ) or '.' f . write ( 'Project("%s") = "%s", "%s", "%s"\r\n' % ( e . entry_type_guid , # Entry type GUID e . name , # Folder name folder_name , # Folder name (again) e . get_guid ( ) , # Entry GUID ) ) # TODO(rspangler): Need a way to configure this stuff if self . websiteProperties : f . write ( '\tProjectSection(WebsiteProperties) = preProject\r\n' '\t\tDebug.AspNetCompiler.Debug = "True"\r\n' '\t\tRelease.AspNetCompiler.Debug = "False"\r\n' '\tEndProjectSection\r\n' ) if isinstance ( e , MSVSFolder ) : if e . items : f . write ( '\tProjectSection(SolutionItems) = preProject\r\n' ) for i in e . items : f . write ( '\t\t%s = %s\r\n' % ( i , i ) ) f . write ( '\tEndProjectSection\r\n' ) if isinstance ( e , MSVSProject ) : if e . dependencies : f . write ( '\tProjectSection(ProjectDependencies) = postProject\r\n' ) for d in e . dependencies : f . write ( '\t\t%s = %s\r\n' % ( d . get_guid ( ) , d . get_guid ( ) ) ) f . write ( '\tEndProjectSection\r\n' ) f . write ( 'EndProject\r\n' ) # Global section f . write ( 'Global\r\n' ) # Configurations (variants) f . write ( '\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n' ) for v in self . variants : f . write ( '\t\t%s = %s\r\n' % ( v , v ) ) f . write ( '\tEndGlobalSection\r\n' ) # Sort config guids for easier diffing of solution changes. config_guids = [ ] config_guids_overrides = { } for e in all_entries : if isinstance ( e , MSVSProject ) : config_guids . append ( e . get_guid ( ) ) config_guids_overrides [ e . get_guid ( ) ] = e . config_platform_overrides config_guids . sort ( ) f . write ( '\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n' ) for g in config_guids : for v in self . variants : nv = config_guids_overrides [ g ] . get ( v , v ) # Pick which project configuration to build for this solution # configuration. f . write ( '\t\t%s.%s.ActiveCfg = %s\r\n' % ( g , # Project GUID v , # Solution build configuration nv , # Project build config for that solution config ) ) # Enable project in this solution configuration. f . write ( '\t\t%s.%s.Build.0 = %s\r\n' % ( g , # Project GUID v , # Solution build configuration nv , # Project build config for that solution config ) ) f . write ( '\tEndGlobalSection\r\n' ) # TODO(rspangler): Should be able to configure this stuff too (though I've # never seen this be any different) f . write ( '\tGlobalSection(SolutionProperties) = preSolution\r\n' ) f . write ( '\t\tHideSolutionNode = FALSE\r\n' ) f . write ( '\tEndGlobalSection\r\n' ) # Folder mappings # Omit this section if there are no folders if any ( [ e . entries for e in all_entries if isinstance ( e , MSVSFolder ) ] ) : f . write ( '\tGlobalSection(NestedProjects) = preSolution\r\n' ) for e in all_entries : if not isinstance ( e , MSVSFolder ) : continue # Does not apply to projects, only folders for subentry in e . entries : f . write ( '\t\t%s = %s\r\n' % ( subentry . get_guid ( ) , e . get_guid ( ) ) ) f . write ( '\tEndGlobalSection\r\n' ) f . write ( 'EndGlobal\r\n' ) f . close ( )