Guess .h language

This commit is contained in:
Joshua Peek
2011-05-27 14:57:11 -05:00
parent c73d45f9f9
commit 61bdd3deaf
12 changed files with 118 additions and 6 deletions

View File

@@ -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

8
test/fixtures/blob/Foo.h vendored Normal file
View File

@@ -0,0 +1,8 @@
#import <Foundation/Foundation.h>
@interface Foo : NSObject {
}
@end

6
test/fixtures/blob/Foo.m vendored Normal file
View File

@@ -0,0 +1,6 @@
#import "Foo.h"
@implementation Foo
@end

10
test/fixtures/blob/FooAppDelegate.h vendored Normal file
View File

@@ -0,0 +1,10 @@
#import <Cocoa/Cocoa.h>
@interface FooAppDelegate : NSObject <NSApplicationDelegate> {
@private
NSWindow *window;
}
@property (assign) IBOutlet NSWindow *window;
@end

12
test/fixtures/blob/FooAppDelegate.m vendored Normal file
View File

@@ -0,0 +1,12 @@
#import "FooAppDelegate.h"
@implementation FooAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
}
@end

10
test/fixtures/blob/bar.h vendored Normal file
View File

@@ -0,0 +1,10 @@
class Bar
{
protected:
char *name;
public:
void hello();
}

10
test/fixtures/blob/bar.hpp vendored Normal file
View File

@@ -0,0 +1,10 @@
class Bar
{
protected:
char *name;
public:
void hello();
}

6
test/fixtures/blob/hello.c vendored Normal file
View File

@@ -0,0 +1,6 @@
#include <stdio.h>
void main()
{
printf("Hello World\n");
}

8
test/fixtures/blob/hello.cpp vendored Normal file
View File

@@ -0,0 +1,8 @@
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World" << endl;
}

6
test/fixtures/blob/hello.h vendored Normal file
View File

@@ -0,0 +1,6 @@
#ifndef HELLO_H
#define HELLO_H
void hello();
#endif

7
test/fixtures/blob/hello.m vendored Normal file
View File

@@ -0,0 +1,7 @@
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
NSLog(@"Hello, World!\n");
return 0;
}

View File

@@ -184,6 +184,16 @@ class TestBlob < Test::Unit::TestCase
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