Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

QSSense fixup #2342

Merged
merged 6 commits into from May 16, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 0 additions & 1 deletion Quicksilver/Code-QuickStepCore/QSCore.h
Expand Up @@ -19,7 +19,6 @@
#import "QSComputerSource.h"
#import "QSDebug.h"
#import "QSDefines.h"
#import "QSense.h"
#import "QSExecutor.h"
#import "QSGlobalSelectionProvider.h"
#import "QSHandledObjectHandler.h"
Expand Down
2 changes: 1 addition & 1 deletion Quicksilver/Code-QuickStepCore/QSStringRanker.m
Expand Up @@ -7,7 +7,7 @@
//

#import "QSStringRanker.h"
#import "QSense.h"
#import "QSSense.h"
#import "NSString_Purification.h"

@implementation QSDefaultStringRanker
Expand Down
Expand Up @@ -13,16 +13,9 @@ NSAttributedString * highlightString(NSString *string, NSString *keyString);
NSComparisonResult prefixCompare(NSString *aString, NSString *bString);

@interface NSString (Abbreviation)
- (CGFloat) scoreForString:(NSString *)string;

- (NSArray *)hitsForString:(NSString *)testString;

- (CGFloat) scoreForAbbreviation:(NSString *)abbreviation;
//- (float) oldScoreForAbbreviation:(NSString *)abbreviation;
- (CGFloat) scoreForAbbreviation:(NSString *)abbreviation hitMask:(NSMutableIndexSet *)mask;
//- (float) oldScoreForAbbreviation:(NSString *)abbreviation hitMask:(NSMutableIndexSet *)mask;
- (CGFloat) scoreForAbbreviation:(NSString *)abbreviation inRange:(NSRange)searchRange fromRange:(NSRange)abbreviationRange hitMask:(NSMutableIndexSet *)mask;

@end

@interface NSAttributedString (Sizing)
Expand Down
58 changes: 6 additions & 52 deletions Quicksilver/Code-QuickStepFoundation/NSString_BLTRExtensions.m
Expand Up @@ -16,6 +16,7 @@ NSComparisonResult prefixCompare(NSString *aString, NSString *bString) {
}

@implementation NSString (Abbreviation)
/* FIXME: This can be removed sometimes */
- (CGFloat) scoreForString:(NSString *)testString {
CGFloat score = 1;
NSInteger i;
Expand All @@ -34,15 +35,6 @@ - (CGFloat) scoreForString:(NSString *)testString {
return score;
}

#if 0
- (CGFloat) oldScoreForAbbreviation:(NSString *)abbreviation hitMask:(NSMutableIndexSet *)mask {
return [self scoreForAbbreviation:abbreviation inRange:NSMakeRange(0, [self length]) fromRange:NSMakeRange(0, [abbreviation length]) hitMask:mask];
}
- (CGFloat) oldScoreForAbbreviation:(NSString *)abbreviation {
return [self oldScoreForAbbreviation:abbreviation hitMask:nil];
}
#endif

- (CGFloat) scoreForAbbreviation:(NSString *)abbreviation {
return [self scoreForAbbreviation:abbreviation hitMask:nil];
}
Expand All @@ -51,51 +43,13 @@ - (CGFloat) scoreForAbbreviation:(NSString *)abbreviation hitMask:(NSMutableInde
}

- (CGFloat) scoreForAbbreviation:(NSString *)abbreviation inRange:(NSRange)searchRange fromRange:(NSRange)abbreviationRange hitMask:(NSMutableIndexSet *)mask {
CGFloat score, remainingScore;
NSInteger i, j;
NSRange matchedRange, remainingSearchRange;
if (!abbreviationRange.length) return 0.9; //deduct some points for all remaining letters
if (abbreviationRange.length>searchRange.length) return 0.0;
for (i = abbreviationRange.length; i>0; i--) { //Search for steadily smaller portions of the abbreviation
matchedRange = [self rangeOfString:[abbreviation substringWithRange:NSMakeRange(abbreviationRange.location, i)] options:NSCaseInsensitiveSearch range:searchRange];

if (matchedRange.location == NSNotFound || matchedRange.location+abbreviationRange.length>NSMaxRange(searchRange)) continue;

if (mask) [mask addIndexesInRange:matchedRange];

remainingSearchRange.location = NSMaxRange(matchedRange);
remainingSearchRange.length = NSMaxRange(searchRange) -remainingSearchRange.location;

// Search what is left of the string with the rest of the abbreviation
remainingScore = [self scoreForAbbreviation:abbreviation inRange:remainingSearchRange fromRange:NSMakeRange(abbreviationRange.location+i, abbreviationRange.length-i) hitMask:mask];
if (remainingScore) {
score = remainingSearchRange.location-searchRange.location;
// ignore skipped characters if is first letter of a word
if (matchedRange.location>searchRange.location) {//if some letters were skipped
if ([[NSCharacterSet whitespaceCharacterSet] characterIsMember:[self characterAtIndex:matchedRange.location-1]]) {
for (j = matchedRange.location-2; j >= (NSInteger) searchRange.location; j--) {
if ([[NSCharacterSet whitespaceCharacterSet] characterIsMember:[self characterAtIndex:j]]) score--;
else score -= 0.15;
}
} else if ([[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:[self characterAtIndex:matchedRange.location]]) {
for (j = matchedRange.location-1; j >= (NSInteger) searchRange.location; j--) {
if ([[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:[self characterAtIndex:j]])
score--;
else
score -= 0.15;
}
} else {
score -= matchedRange.location-searchRange.location;
}
}
score += remainingScore*remainingSearchRange.length;
score /= searchRange.length;
return score;
}
}
return 0;
CFRange strRange = CFRangeMake(searchRange.location, searchRange.length);
CFRange abbrRange = CFRangeMake(abbreviationRange.location, abbreviationRange.length);

return QSScoreForAbbreviationWithRanges((__bridge CFStringRef)self, (__bridge CFStringRef)abbreviation, mask, strRange, abbrRange);
}

/* FIXME: This can be removed sometimes */
- (NSArray *)hitsForString:(NSString *)testString {
NSMutableArray *hitsArray = [NSMutableArray arrayWithCapacity:[self length]];
NSUInteger i;
Expand Down
1 change: 1 addition & 0 deletions Quicksilver/Code-QuickStepFoundation/QSFoundation.h
Expand Up @@ -32,6 +32,7 @@
#import "QSLSTools.h"
#import "QSLog.h"
#import "QSHotKeyEvent.h"
#import "QSSense.h"
#import "NSWorkspace_BLTRExtensions.h"
#import "NSWindow_BLTRExtensions.h"
#import "NSView_BLTRExtensions.h"
Expand Down
Expand Up @@ -10,3 +10,4 @@


CGFloat QSScoreForAbbreviation(CFStringRef string, CFStringRef abbr, id hitMask);
CGFloat QSScoreForAbbreviationWithRanges(CFStringRef str, CFStringRef abbr, id mask, CFRange strRange, CFRange abbrRange);
110 changes: 110 additions & 0 deletions Quicksilver/Code-QuickStepFoundation/QSSense.m
@@ -0,0 +1,110 @@
//
// QSense.m
// QSqSense
//
// Created by Alcor on 11/22/04.
// Copyright 2004 Blacktree. All rights reserved.
//

#import "QSSense.h"

#define MIN_ABBR_OPTIMIZE 0
#define IGNORED_SCORE 0.9
#define SKIPPED_SCORE 0.15



CGFloat QSScoreForAbbreviationWithRanges(CFStringRef str, CFStringRef abbr, id mask, CFRange strRange, CFRange abbrRange);

CGFloat QSScoreForAbbreviation(CFStringRef str, CFStringRef abbr, id mask) {
return QSScoreForAbbreviationWithRanges(str, abbr, mask, CFRangeMake(0, CFStringGetLength(str)), CFRangeMake(0, CFStringGetLength(abbr)));
}

CGFloat QSScoreForAbbreviationWithRanges(CFStringRef str, CFStringRef abbr, id mask, CFRange strRange, CFRange abbrRange) {
if (!abbrRange.length)
return IGNORED_SCORE; //deduct some points for all remaining letters

if (abbrRange.length > strRange.length)
return 0.0;

static CFCharacterSetRef wordSeparator = NULL;
static CFCharacterSetRef uppercase = NULL;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
wordSeparator = CFCharacterSetCreateMutableCopy(NULL, CFCharacterSetGetPredefined(kCFCharacterSetWhitespace));
CFCharacterSetAddCharactersInString((CFMutableCharacterSetRef)wordSeparator, (CFStringRef)@".");

uppercase = CFCharacterSetGetPredefined(kCFCharacterSetUppercaseLetter);
});

// Create an inline buffer version of str. Will be used in loop below
// for faster lookups.
CFStringInlineBuffer inlineBuffer;
CFStringInitInlineBuffer(str, &inlineBuffer, strRange);
CFLocaleRef userLoc = CFLocaleCopyCurrent();

CGFloat score = 0.0, remainingScore = 0.0;
CFIndex i, j;
CFRange matchedRange, remainingStrRange, adjustedStrRange = strRange;

// Search for steadily smaller portions of the abbreviation
for (i = abbrRange.length; i > 0; i--) {
CFStringRef curAbbr = CFStringCreateWithSubstring (NULL, abbr, CFRangeMake(abbrRange.location, i) );
// terminality
// axeen

BOOL found = CFStringFindWithOptionsAndLocale(str, curAbbr,
CFRangeMake(adjustedStrRange.location, adjustedStrRange.length - abbrRange.length + i),
kCFCompareCaseInsensitive | kCFCompareDiacriticInsensitive | kCFCompareLocalized,
userLoc, &matchedRange);
CFRelease(curAbbr);

if (!found) {
continue;
}

if (mask) {
[mask addIndexesInRange:NSMakeRange(matchedRange.location, matchedRange.length)];
}

remainingStrRange.location = matchedRange.location + matchedRange.length;
remainingStrRange.length = strRange.location + strRange.length - remainingStrRange.location;

// Search what is left of the string with the rest of the abbreviation
remainingScore = QSScoreForAbbreviationWithRanges(str, abbr, mask, remainingStrRange, CFRangeMake(abbrRange.location + i, abbrRange.length - i));

if (remainingScore) {
score = remainingStrRange.location-strRange.location;
// ignore skipped characters if is first letter of a word
if (matchedRange.location > strRange.location) {
// if some letters were skipped
UniChar previousChar = CFStringGetCharacterFromInlineBuffer(&inlineBuffer, matchedRange.location - 1);
UniChar character = CFStringGetCharacterFromInlineBuffer(&inlineBuffer, matchedRange.location);
if (CFCharacterSetIsCharacterMember(wordSeparator, previousChar)) {
// We're on the first letter of a word
for (j = matchedRange.location - 2; j >= strRange.location; j--) {
if (CFCharacterSetIsCharacterMember(wordSeparator, CFStringGetCharacterFromInlineBuffer(&inlineBuffer, j)))
score--;
else
score -= SKIPPED_SCORE;
}
} else if (CFCharacterSetIsCharacterMember(uppercase, character)) {
for (j = matchedRange.location - 1; j >= strRange.location; j--) {
if (CFCharacterSetIsCharacterMember(uppercase, CFStringGetCharacterFromInlineBuffer(&inlineBuffer, j)))
score--;
else
score -= SKIPPED_SCORE;
}
} else {
score -= (matchedRange.location-strRange.location)/2;
}
}
score += remainingScore * remainingStrRange.length;
score /= strRange.length;
CFRelease(userLoc);
return score;
}
}
CFRelease(userLoc);
return 0;
}
20 changes: 12 additions & 8 deletions Quicksilver/Quicksilver.xcodeproj/project.pbxproj
Expand Up @@ -158,6 +158,9 @@
4DD89F290EBDDBA9005A15AE /* QSNotifications.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DD89F200EBDDBA9005A15AE /* QSNotifications.h */; settings = {ATTRIBUTES = (Public, ); }; };
4DD89F2A0EBDDBA9005A15AE /* QSPreferenceKeys.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DD89F210EBDDBA9005A15AE /* QSPreferenceKeys.h */; settings = {ATTRIBUTES = (Public, ); }; };
4DD89F2B0EBDDBA9005A15AE /* QSTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DD89F220EBDDBA9005A15AE /* QSTypes.h */; settings = {ATTRIBUTES = (Public, ); }; };
4DF329D61EA2C1C9003CD3CE /* QSSense.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E5FB7907B20DD10044D6EF /* QSSense.h */; settings = {ATTRIBUTES = (Public, ); }; };
4DF329D71EA2C1D5003CD3CE /* QSSense.m in Sources */ = {isa = PBXBuildFile; fileRef = E1E5FB7A07B20DD10044D6EF /* QSSense.m */; };
4DF329D91EA2C5F0003CD3CE /* TestQSSense.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DF329D81EA2C5F0003CD3CE /* TestQSSense.m */; };
4DF441B50ED9C66700656AD1 /* QSHandledObjectHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FB8AD4D08E6328D000A65C4 /* QSHandledObjectHandler.m */; };
4DFE7DA20E081A3B000B9AA3 /* NSImage+QuickLook.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DFE7DA00E081A30000B9AA3 /* NSImage+QuickLook.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
4DFE7DA30E081A3C000B9AA3 /* NSImage+QuickLook.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DFE7D9F0E081A30000B9AA3 /* NSImage+QuickLook.h */; settings = {ATTRIBUTES = (Public, ); }; };
Expand Down Expand Up @@ -633,8 +636,6 @@
E1E5FBE207B20DD20044D6EF /* QSComputerSource.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E5FB7507B20DD10044D6EF /* QSComputerSource.h */; settings = {ATTRIBUTES = (Public, ); }; };
E1E5FBE307B20DD20044D6EF /* QSComputerSource.m in Sources */ = {isa = PBXBuildFile; fileRef = E1E5FB7607B20DD10044D6EF /* QSComputerSource.m */; };
E1E5FBE407B20DD20044D6EF /* QSCore.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E5FB7707B20DD10044D6EF /* QSCore.h */; settings = {ATTRIBUTES = (Public, ); }; };
E1E5FBE607B20DD20044D6EF /* QSense.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E5FB7907B20DD10044D6EF /* QSense.h */; settings = {ATTRIBUTES = (Public, ); }; };
E1E5FBE707B20DD20044D6EF /* QSense.m in Sources */ = {isa = PBXBuildFile; fileRef = E1E5FB7A07B20DD10044D6EF /* QSense.m */; };
E1E5FBE807B20DD20044D6EF /* QSExecutor.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E5FB7B07B20DD10044D6EF /* QSExecutor.h */; settings = {ATTRIBUTES = (Public, ); }; };
E1E5FBE907B20DD20044D6EF /* QSExecutor.m in Sources */ = {isa = PBXBuildFile; fileRef = E1E5FB7C07B20DD10044D6EF /* QSExecutor.m */; };
E1E5FBEA07B20DD20044D6EF /* QSGlobalSelectionProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E5FB7D07B20DD10044D6EF /* QSGlobalSelectionProvider.h */; settings = {ATTRIBUTES = (Public, ); }; };
Expand Down Expand Up @@ -1177,6 +1178,7 @@
4DD89F200EBDDBA9005A15AE /* QSNotifications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSNotifications.h; sourceTree = "<group>"; usesTabs = 1; };
4DD89F210EBDDBA9005A15AE /* QSPreferenceKeys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSPreferenceKeys.h; sourceTree = "<group>"; usesTabs = 1; };
4DD89F220EBDDBA9005A15AE /* QSTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSTypes.h; sourceTree = "<group>"; usesTabs = 1; };
4DF329D81EA2C5F0003CD3CE /* TestQSSense.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestQSSense.m; path = "Tests/Tests-QSFoundation/TestQSSense.m"; sourceTree = "<group>"; };
4DFE7D9F0E081A30000B9AA3 /* NSImage+QuickLook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage+QuickLook.h"; sourceTree = "<group>"; };
4DFE7DA00E081A30000B9AA3 /* NSImage+QuickLook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSImage+QuickLook.m"; sourceTree = "<group>"; };
4DFE7DA10E081A30000B9AA3 /* README.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = README.rtf; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2185,8 +2187,8 @@
E1E5FB7507B20DD10044D6EF /* QSComputerSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = QSComputerSource.h; sourceTree = "<group>"; usesTabs = 1; };
E1E5FB7607B20DD10044D6EF /* QSComputerSource.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = QSComputerSource.m; sourceTree = "<group>"; usesTabs = 1; };
E1E5FB7707B20DD10044D6EF /* QSCore.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = QSCore.h; sourceTree = "<group>"; usesTabs = 1; };
E1E5FB7907B20DD10044D6EF /* QSense.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = QSense.h; sourceTree = "<group>"; usesTabs = 1; };
E1E5FB7A07B20DD10044D6EF /* QSense.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = QSense.m; sourceTree = "<group>"; usesTabs = 1; };
E1E5FB7907B20DD10044D6EF /* QSSense.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = QSSense.h; sourceTree = "<group>"; usesTabs = 1; };
E1E5FB7A07B20DD10044D6EF /* QSSense.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = QSSense.m; sourceTree = "<group>"; usesTabs = 1; };
E1E5FB7B07B20DD10044D6EF /* QSExecutor.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = QSExecutor.h; sourceTree = "<group>"; usesTabs = 1; };
E1E5FB7C07B20DD10044D6EF /* QSExecutor.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = QSExecutor.m; sourceTree = "<group>"; usesTabs = 1; wrapsLines = 1; };
E1E5FB7D07B20DD10044D6EF /* QSGlobalSelectionProvider.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = QSGlobalSelectionProvider.h; sourceTree = "<group>"; usesTabs = 1; };
Expand Down Expand Up @@ -2642,6 +2644,7 @@
children = (
CD661C5319DBD2F3000F3695 /* TestNSApplicationMethods.m */,
66448E1214F42A4E000FA2E2 /* TestPathWildcards.m */,
4DF329D81EA2C5F0003CD3CE /* TestQSSense.m */,
);
name = QSFoundationTests;
sourceTree = "<group>";
Expand Down Expand Up @@ -3194,6 +3197,8 @@
CDCC200E10A4C14B009C4EED /* QSMDPredicate.h */,
CDCC200F10A4C14B009C4EED /* QSMDPredicate.m */,
4DD89F1F0EBDDBA9005A15AE /* QSMacros.h */,
E1E5FB7907B20DD10044D6EF /* QSSense.h */,
E1E5FB7A07B20DD10044D6EF /* QSSense.m */,
E1E5FA6E07B204BE0044D6EF /* NDAlias+QSMods.h */,
E1E5FA6F07B204BE0044D6EF /* NDAlias+QSMods.m */,
E1E5FA7007B204BE0044D6EF /* NDProcess+QSMods.h */,
Expand Down Expand Up @@ -3306,8 +3311,6 @@
4DD89F1C0EBDDBA9005A15AE /* QSDefines.h */,
D49399091350078E00B908C6 /* QSDownloads.h */,
D493990A1350078E00B908C6 /* QSDownloads.m */,
E1E5FB7907B20DD10044D6EF /* QSense.h */,
E1E5FB7A07B20DD10044D6EF /* QSense.m */,
E1E5FB7B07B20DD10044D6EF /* QSExecutor.h */,
E1E5FB7C07B20DD10044D6EF /* QSExecutor.m */,
E1E5FB7D07B20DD10044D6EF /* QSGlobalSelectionProvider.h */,
Expand Down Expand Up @@ -3600,7 +3603,6 @@
E1E5FBE407B20DD20044D6EF /* QSCore.h in Headers */,
4DD89F240EBDDBA9005A15AE /* QSDebug.h in Headers */,
4DD89F250EBDDBA9005A15AE /* QSDefines.h in Headers */,
E1E5FBE607B20DD20044D6EF /* QSense.h in Headers */,
E1E5FBE807B20DD20044D6EF /* QSExecutor.h in Headers */,
E1E5FBEA07B20DD20044D6EF /* QSGlobalSelectionProvider.h in Headers */,
7FB8AD4E08E6328D000A65C4 /* QSHandledObjectHandler.h in Headers */,
Expand Down Expand Up @@ -3772,6 +3774,7 @@
CD803A381C5C3D2D00CF90F3 /* SFLListItem.h in Headers */,
4D66BC25148701EA00351C42 /* NSPathControl+NDAlias.h in Headers */,
4D66BC27148701EA00351C42 /* NSSavePanel+NDAlias.h in Headers */,
4DF329D61EA2C1C9003CD3CE /* QSSense.h in Headers */,
4D66BC29148701EA00351C42 /* NSString+NDCarbonUtilities.h in Headers */,
D4BDCC1F19E7F8F50080710C /* SUExport.h in Headers */,
D4BDCC1C19E7F78F0080710C /* SUStandardVersionComparator.h in Headers */,
Expand Down Expand Up @@ -4603,6 +4606,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4DF329D91EA2C5F0003CD3CE /* TestQSSense.m in Sources */,
CD661C5419DBD2F3000F3695 /* TestNSApplicationMethods.m in Sources */,
66448E1314F42A4E000FA2E2 /* TestPathWildcards.m in Sources */,
);
Expand Down Expand Up @@ -4691,7 +4695,6 @@
E1E5FBDD07B20DD20044D6EF /* QSCollection.m in Sources */,
E1E5FBDF07B20DD20044D6EF /* QSCommand.m in Sources */,
E1E5FBE307B20DD20044D6EF /* QSComputerSource.m in Sources */,
E1E5FBE707B20DD20044D6EF /* QSense.m in Sources */,
E1E5FBE907B20DD20044D6EF /* QSExecutor.m in Sources */,
E1E5FBEB07B20DD20044D6EF /* QSGlobalSelectionProvider.m in Sources */,
4DF441B50ED9C66700656AD1 /* QSHandledObjectHandler.m in Sources */,
Expand Down Expand Up @@ -4809,6 +4812,7 @@
7FDF341907F7D59E00594789 /* NSDictionary+BLTRExtensions.m in Sources */,
7F3DB4BB0926D1620062EDFD /* NSEvent+BLTRExtensions.m in Sources */,
E1E5FABC07B204BF0044D6EF /* NSException_TraceExtensions.m in Sources */,
4DF329D71EA2C1D5003CD3CE /* QSSense.m in Sources */,
E1E5FABE07B204BF0044D6EF /* NSFileManager_BLTRExtensions.m in Sources */,
E1E5FAC007B204BF0044D6EF /* NSGeometry_BLTRExtensions.m in Sources */,
4DFE7DA20E081A3B000B9AA3 /* NSImage+QuickLook.m in Sources */,
Expand Down