Skip to content
Snippets Groups Projects
  • Douglas Gregor's avatar
    a6620f38
    Substitute type arguments into uses of Objective-C interface members. · a6620f38
    Douglas Gregor authored
    When messaging a method that was defined in an Objective-C class (or
    category or extension thereof) that has type parameters, substitute
    the type arguments for those type parameters. Similarly, substitute
    into property accesses, instance variables, and other references.
    
    This includes general infrastructure for substituting the type
    arguments associated with an ObjCObject(Pointer)Type into a type
    referenced within a particular context, handling all of the
    substitutions required to deal with (e.g.) inheritance involving
    parameterized classes. In cases where no type arguments are available
    (e.g., because we're messaging via some unspecialized type, id, etc.),
    we substitute in the type bounds for the type parameters instead.
    
    Example:
    
      @interface NSSet<T : id<NSCopying>> : NSObject <NSCopying>
      - (T)firstObject;
      @end
    
      void f(NSSet<NSString *> *stringSet, NSSet *anySet) {
        [stringSet firstObject]; // produces NSString*
        [anySet firstObject]; // produces id<NSCopying> (the bound)
      }
    
    When substituting for the type parameters given an unspecialized
    context (i.e., no specific type arguments were given), substituting
    the type bounds unconditionally produces type signatures that are too
    strong compared to the pre-generics signatures. Instead, use the
    following rule:
    
      - In covariant positions, such as method return types, replace type
        parameters with “id” or “Class” (the latter only when the type
        parameter bound is “Class” or qualified class, e.g,
        “Class<NSCopying>”)
      - In other positions (e.g., parameter types), replace type
        parameters with their type bounds.
      - When a specialized Objective-C object or object pointer type
        contains a type parameter in its type arguments (e.g.,
        NSArray<T>*, but not NSArray<NSString *> *), replace the entire
        object/object pointer type with its unspecialized version (e.g.,
        NSArray *).
    
    git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241543 91177308-0d34-0410-b5e6-96231b3b80d8
    a6620f38
    History
    Substitute type arguments into uses of Objective-C interface members.
    Douglas Gregor authored
    When messaging a method that was defined in an Objective-C class (or
    category or extension thereof) that has type parameters, substitute
    the type arguments for those type parameters. Similarly, substitute
    into property accesses, instance variables, and other references.
    
    This includes general infrastructure for substituting the type
    arguments associated with an ObjCObject(Pointer)Type into a type
    referenced within a particular context, handling all of the
    substitutions required to deal with (e.g.) inheritance involving
    parameterized classes. In cases where no type arguments are available
    (e.g., because we're messaging via some unspecialized type, id, etc.),
    we substitute in the type bounds for the type parameters instead.
    
    Example:
    
      @interface NSSet<T : id<NSCopying>> : NSObject <NSCopying>
      - (T)firstObject;
      @end
    
      void f(NSSet<NSString *> *stringSet, NSSet *anySet) {
        [stringSet firstObject]; // produces NSString*
        [anySet firstObject]; // produces id<NSCopying> (the bound)
      }
    
    When substituting for the type parameters given an unspecialized
    context (i.e., no specific type arguments were given), substituting
    the type bounds unconditionally produces type signatures that are too
    strong compared to the pre-generics signatures. Instead, use the
    following rule:
    
      - In covariant positions, such as method return types, replace type
        parameters with “id” or “Class” (the latter only when the type
        parameter bound is “Class” or qualified class, e.g,
        “Class<NSCopying>”)
      - In other positions (e.g., parameter types), replace type
        parameters with their type bounds.
      - When a specialized Objective-C object or object pointer type
        contains a type parameter in its type arguments (e.g.,
        NSArray<T>*, but not NSArray<NSString *> *), replace the entire
        object/object pointer type with its unspecialized version (e.g.,
        NSArray *).
    
    git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241543 91177308-0d34-0410-b5e6-96231b3b80d8
Code owners
Assign users and groups as approvers for specific file changes. Learn more.