Wiki

Ticket #152: implicit-dependency-refs.patch

File implicit-dependency-refs.patch, 6.8 KB (added by hopscc, 5 years ago)
  • Source/Compiler.cobra

     
    782782            _referenceVerbosity = .options.getDefault('verbosity-ref', 0) 
    783783        return _referenceVerbosity 
    784784 
    785     var _willReadDependencies = false 
     785    var _willReadDependencies = true # false to suppress implicit dependency refs 
    786786 
    787787    def indentPrint 
    788788        # see .loadReference which sets up the indented writer 
  • Source/NameSpace.cobra

     
    2929    var _subNameSpacesByName as Dictionary<of String, NameSpace> 
    3030    var _subNameSpacesList as List<of NameSpace> 
    3131    var _useDirectives as List<of UseDirective> 
    32  
     32     
     33    var _wasAccessed = false 
     34     
    3335    cue init(unifiedNameSpace as NameSpace, name as String) 
    3436        .init(TokenFix.empty, name) 
    3537        _unifiedNameSpace = unifiedNameSpace 
     
    98100 
    99101    get useDirectives as UseDirective* 
    100102        return _useDirectives 
    101  
     103         
     104    get wasAccessed as bool 
     105        """True if (unified) namespace had successful search done through it.""" 
     106        if not .isUnified, return _unifiedNameSpace.wasAccessed 
     107        return _wasAccessed 
     108                 
    102109    def addMinFields 
    103110        base.addMinFields 
    104111        .addField('subCount', _subNameSpacesList.count) 
     
    111118        .addField('unifiedNameSpace', _unifiedNameSpace) 
    112119 
    113120    var _fullName as String? # TODO: put in .fullName property when that is supported 
    114  
     121     
    115122    get fullName as String 
    116123        ensure 
    117124            not .isRoot implies .name in result 
     
    321328            # our decl? 
    322329            # TODO: should this come before checking our name? what does C# do? 
    323330            x = .declForName(name) 
    324             if x, return x 
     331            if x  
     332                _wasAccessed = true 
     333                return x 
    325334/# 
    326335            # wrong. see ticket:128 
    327336            # a parent namespace? 
  • Source/BackEndClr/SharpGenerator.cobra

     
    147147            for refer in .loadedReferences  # don't take the library references from options, because the references can grow 
    148148                if refer == 'Cobra.Lang.dll', continue  # hack. remove at some point 2012-07-17 
    149149                backEndOptions.add('[optChar]r:[refer]') 
    150  
     150                 
     151            # Add in refs for any dependant assemblyModules accessed but not specified 
     152            if _willReadDependencies # was wired false in Compiler.cobra 
     153                for refer in _implicitRefs 
     154                    backEndOptions.add('[optChar]r:[refer]') 
     155                     
     156                         
    151157            debug = options.getDefault('debug', '') to String 
    152158            if debug.length 
    153159                # TODO: mono does not support full and pdbonly afaik 
     
    228234            _deleteIntermediateFiles 
    229235             
    230236            _copyCoreClr(outName) 
    231  
     237             
     238    def _implicitRefs as Set<of String> 
     239        """Accumulate list of dll modules loaded whose namespace contents are referenced that arent in loaded references""" 
     240        implicitRefs = Set<of String>() 
     241        for m in .modules    
     242            if m inherits AssemblyModule 
     243                fileName = Path.getFileName(m.fileName) to !  
     244                refName = fileName.before('.dll') 
     245                if _moduleRefUsed(refName, m.topNameSpace) and fileName not in .loadedReferences 
     246                    if .verbosity,  print 'adding implicit ref [fileName]' 
     247                    implicitRefs.add(fileName) 
     248        return implicitRefs 
     249                 
     250    def _moduleRefUsed(refName as String, ns as NameSpace) as bool 
     251        names = refName.split(c'.') 
     252        thing as IContainer? = ns 
     253        for name in names 
     254            possible = thing.declForName(name) #shld be nil or a NameSpace 
     255            if not possible, return false 
     256            if possible inherits IContainer 
     257                thing = possible 
     258        return (thing to NameSpace).wasAccessed 
     259             
    232260    def _copyCoreClr(outName as String) 
    233261        if not .options.boolValue('copy-core'), return 
    234262        sourceDir = Path.getDirectoryName(Assembly.getEntryAssembly.location) ? '' 
  • Source/BackEndClr/ScanClrType.cobra

     
    7676                    if referredAss is nil, return couldNotFindMsg 
    7777                    reference += if(referredAss.location.endsWith('.exe'), '.exe', '.dll') 
    7878            if referredAss 
    79                 if _willReadDependencies # wired false in Compiler.cobra 
    80                     for dependency in referredAss.getReferencedAssemblies 
    81                         if rv 
    82                             print '>> Loading dependency: [dependency]' 
    83                             .indentPrint 
    84                             try 
    85                                 _loadAssemblyNamed(dependency) 
    86                             finally 
    87                                 .outdentPrint 
    88                                 print '<< Loading dependency: [dependency]' 
    89                         else 
    90                             _loadAssemblyNamed(dependency) 
     79                if _willReadDependencies # was wired false in Compiler.cobra 
     80                    _loadAssemblyDependencies(referredAss, rv) 
    9181                if rv, print 'Will read assembly: [referredAss]' 
    9282                try 
    9383                    _readAssembly(referredAss, reference <> 'Cobra.Core.dll') 
     
    139129            msg = 'Could not open assembly "[assName]" due to: [exc.getType.name]: [exc.message]' 
    140130            if rv, print msg 
    141131            throw SourceException(msg) 
    142         if _willReadDependencies # wired false in Compiler.cobra 
    143             for dependency in ass.getReferencedAssemblies 
    144                 if rv 
    145                     print '>> Loading dependency: [dependency]' 
    146                     .indentPrint 
    147                     try 
    148                         _loadAssemblyNamed(dependency) 
    149                     finally 
    150                         .outdentPrint 
    151                         print '<< Loading dependency: [dependency]' 
     132        if _willReadDependencies # was wired false in Compiler.cobra 
     133            _loadAssemblyDependencies(ass to !, rv) 
    152134        try 
    153135            .clrReadAssembly(ass to !) 
    154136        catch readExc as Exception 
    155137            if rv, print 'Caught exception during read assembly: [readExc]' 
    156138            throw 
    157  
     139             
     140    def _loadAssemblyDependencies(referredAss as Assembly, rv as int) 
     141        for dependency in referredAss.getReferencedAssemblies 
     142            if rv 
     143                print '>> Loading dependency: [dependency]' 
     144                .indentPrint 
     145                try 
     146                    __loadAssemblyNamed(dependency) 
     147                finally 
     148                    .outdentPrint 
     149                    print '<< Loading dependency: [dependency]' 
     150            else 
     151                #print '<< [referredAss.getName.name] has dependency [dependency.name]' 
     152                if dependency.name not in ['mscorlib', 'System'] 
     153                    __loadAssemblyNamed(dependency) 
     154             
    158155    var __willLoadReflectionOnly as bool? 
    159156     
    160157    def _willLoadReflectionOnly as bool 
  • Tests/510-implicit-dependency.cobra

     
     1# previously needed  explicit ref for System.Drawing dependency  
     2use System.Windows.Forms 
     3use System.Drawing 
     4 
     5# failed with next line commented 
     6#@args -ref:System.Drawing 
     7 
     8class Program 
     9 
     10    def main is shared 
     11        print Color.red