From 61bdd3deaf085ab9ce396773bcae412e05fd8c62 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Fri, 27 May 2011 14:57:11 -0500 Subject: [PATCH] Guess .h language --- lib/linguist/blob_helper.rb | 23 +++++++++++++++++++++-- test/fixtures/blob/Foo.h | 8 ++++++++ test/fixtures/blob/Foo.m | 6 ++++++ test/fixtures/blob/FooAppDelegate.h | 10 ++++++++++ test/fixtures/blob/FooAppDelegate.m | 12 ++++++++++++ test/fixtures/blob/bar.h | 10 ++++++++++ test/fixtures/blob/bar.hpp | 10 ++++++++++ test/fixtures/blob/hello.c | 6 ++++++ test/fixtures/blob/hello.cpp | 8 ++++++++ test/fixtures/blob/hello.h | 6 ++++++ test/fixtures/blob/hello.m | 7 +++++++ test/test_blob.rb | 18 ++++++++++++++---- 12 files changed, 118 insertions(+), 6 deletions(-) create mode 100644 test/fixtures/blob/Foo.h create mode 100644 test/fixtures/blob/Foo.m create mode 100644 test/fixtures/blob/FooAppDelegate.h create mode 100644 test/fixtures/blob/FooAppDelegate.m create mode 100644 test/fixtures/blob/bar.h create mode 100644 test/fixtures/blob/bar.hpp create mode 100644 test/fixtures/blob/hello.c create mode 100644 test/fixtures/blob/hello.cpp create mode 100644 test/fixtures/blob/hello.h create mode 100644 test/fixtures/blob/hello.m diff --git a/lib/linguist/blob_helper.rb b/lib/linguist/blob_helper.rb index 0c618fee..5fab5686 100644 --- a/lib/linguist/blob_helper.rb +++ b/lib/linguist/blob_helper.rb @@ -269,8 +269,12 @@ module Linguist # Returns a Language object def language if text? - # First see if there is a Language for the extension - if Language.find_by_extension(extname) + # If its a header file (.h) try to guess the language + if language = header_language + language + + # See if there is a Language for the extension + elsif Language.find_by_extension(extname) pathname.language # Try to detect Language from shebang line @@ -293,6 +297,21 @@ module Linguist language.lexer end + # Internal: Guess language of header files (.h). + # + # Returns a Language. + def header_language + return unless extname == '.h' + + if lines.grep(/^@(interface|property|private|public|end)/).any? + Language['Objective-C'] + elsif lines.grep(/^class |^\s+(public|protected|private):/).any? + Language['C++'] + else + Language['C'] + end + end + # Internal: Extract the script name from the shebang line # # Requires Blob#data diff --git a/test/fixtures/blob/Foo.h b/test/fixtures/blob/Foo.h new file mode 100644 index 00000000..95fbbf5c --- /dev/null +++ b/test/fixtures/blob/Foo.h @@ -0,0 +1,8 @@ +#import + + +@interface Foo : NSObject { + +} + +@end diff --git a/test/fixtures/blob/Foo.m b/test/fixtures/blob/Foo.m new file mode 100644 index 00000000..f11b1bc8 --- /dev/null +++ b/test/fixtures/blob/Foo.m @@ -0,0 +1,6 @@ +#import "Foo.h" + + +@implementation Foo + +@end diff --git a/test/fixtures/blob/FooAppDelegate.h b/test/fixtures/blob/FooAppDelegate.h new file mode 100644 index 00000000..24531b25 --- /dev/null +++ b/test/fixtures/blob/FooAppDelegate.h @@ -0,0 +1,10 @@ +#import + +@interface FooAppDelegate : NSObject { +@private + NSWindow *window; +} + +@property (assign) IBOutlet NSWindow *window; + +@end diff --git a/test/fixtures/blob/FooAppDelegate.m b/test/fixtures/blob/FooAppDelegate.m new file mode 100644 index 00000000..7e8710b7 --- /dev/null +++ b/test/fixtures/blob/FooAppDelegate.m @@ -0,0 +1,12 @@ +#import "FooAppDelegate.h" + +@implementation FooAppDelegate + +@synthesize window; + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + // Insert code here to initialize your application +} + +@end diff --git a/test/fixtures/blob/bar.h b/test/fixtures/blob/bar.h new file mode 100644 index 00000000..a87343c2 --- /dev/null +++ b/test/fixtures/blob/bar.h @@ -0,0 +1,10 @@ +class Bar +{ + protected: + + char *name; + + public: + + void hello(); +} diff --git a/test/fixtures/blob/bar.hpp b/test/fixtures/blob/bar.hpp new file mode 100644 index 00000000..a87343c2 --- /dev/null +++ b/test/fixtures/blob/bar.hpp @@ -0,0 +1,10 @@ +class Bar +{ + protected: + + char *name; + + public: + + void hello(); +} diff --git a/test/fixtures/blob/hello.c b/test/fixtures/blob/hello.c new file mode 100644 index 00000000..96dc0c6a --- /dev/null +++ b/test/fixtures/blob/hello.c @@ -0,0 +1,6 @@ +#include + +void main() +{ + printf("Hello World\n"); +} diff --git a/test/fixtures/blob/hello.cpp b/test/fixtures/blob/hello.cpp new file mode 100644 index 00000000..d36f6e67 --- /dev/null +++ b/test/fixtures/blob/hello.cpp @@ -0,0 +1,8 @@ +#include + +using namespace std; + +int main() +{ + cout << "Hello World" << endl; +} diff --git a/test/fixtures/blob/hello.h b/test/fixtures/blob/hello.h new file mode 100644 index 00000000..f19e5d3b --- /dev/null +++ b/test/fixtures/blob/hello.h @@ -0,0 +1,6 @@ +#ifndef HELLO_H +#define HELLO_H + +void hello(); + +#endif diff --git a/test/fixtures/blob/hello.m b/test/fixtures/blob/hello.m new file mode 100644 index 00000000..1968d762 --- /dev/null +++ b/test/fixtures/blob/hello.m @@ -0,0 +1,7 @@ +#import + +int main(int argc, char *argv[]) +{ + NSLog(@"Hello, World!\n"); + return 0; +} diff --git a/test/test_blob.rb b/test/test_blob.rb index 2acade03..691f95d0 100644 --- a/test/test_blob.rb +++ b/test/test_blob.rb @@ -180,10 +180,20 @@ class TestBlob < Test::Unit::TestCase end def test_language - assert_equal Language['Ruby'], blob("foo.rb").language - assert_equal Language['Ruby'], blob("script.rb").language - assert_equal Language['Text'], blob("octocat.png").language - assert_equal Language['Ruby'], blob("wrong_shebang.rb").language + assert_equal Language['Ruby'], blob("foo.rb").language + assert_equal Language['Ruby'], blob("script.rb").language + assert_equal Language['Text'], blob("octocat.png").language + assert_equal Language['Ruby'], blob("wrong_shebang.rb").language + assert_equal Language['C'], blob("hello.c").language + assert_equal Language['C'], blob("hello.h").language + assert_equal Language['C++'], blob("hello.cpp").language + assert_equal Language['C++'], blob("bar.h").language + assert_equal Language['C++'], blob("bar.hpp").language + assert_equal Language['Objective-C'], blob("hello.m").language + assert_equal Language['Objective-C'], blob("Foo.m").language + assert_equal Language['Objective-C'], blob("Foo.h").language + assert_equal Language['Objective-C'], blob("FooAppDelegate.m").language + assert_equal Language['Objective-C'], blob("FooAppDelegate.h").language end def test_lexer