Coder Social home page Coder Social logo

c-cpp-coverage-for-clion's Introduction

C/C++ Coverage for CLion

alt text

Content

  1. Getting started
    1. Tools
    2. Compiling with Coverage
    3. Running
  2. Differences in compilers
  3. Known Issues/TODOs

Getting Started

Tools

To get coverage you need one of the following compilers: Clang(-cl) 5 or later, GCC 6 or later. Recommended are Clang 6 onwards and GCC 9 onwards. GCC 6 to 8 are not recommended for larger projects and cannot gather branch coverage. To see why refer to Differences in compilers. Both of them use very different ways to gather coverage. GCC ships a tool called gcov while clang requires llvm-cov and llvm-profdata. Make sure the tools versions matches your compilers version. When the plugin sees an empty path for either of the tools it will attempt to guess the correct paths based on C and C++ compiler paths and prefixes and suffixes in their name. Optionally One can specify a demangler when using Clang to demangle C++ symbols. This is not required with GCC as gcov has a built in demangler. Tested and supported demanglers are c++filt and llvm-cxxfilt or llvm-undname when using clang-cl. You can specify your gcov and llvm-cov per toolchain by going into the settings menu under Language & Frameworks -> C/C++ Coverage. There you can also configure different settings related to processing coverage

Compiling with Coverage

To compile with coverage each of the two compilers require different flags. In the case of GCC we need the --coverage flag for the compiler. On some platforms one needs to explicitly link against gcov. For clang we need -fprofile-instr-generate -fcoverage-mapping for compiler flags and -fprofile-instr-generate for linker flags. On some platform one may also need to explicitly link again the libclang_rt.profile-<ARCH>. An example cmake sections is shown here:

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    add_compile_options(-fprofile-instr-generate -fcoverage-mapping)
    add_link_options(-fprofile-instr-generate)
    #Uncomment in case of linker errors
    #link_libraries(clang_rt.profile-x86_64)
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
    add_compile_options(--coverage)
    #Uncomment in case of linker errors
    #link_libraries(gcov)
endif ()

Alternatively one can enable in the settings to not use auto flag detection. Instead a 'Run Coverage' button will appear with which one can explicitly choose to gather coverage data

If your installation of clang does not have the needed profile library you will need to compile it yourself from https://github.com/llvm/llvm-project/tree/master/compiler-rt. Make sure it matches your compilers version

Note:

When using Clang 8 or older on Windows with the GNU target you'll most likely get a linker error due to the symbol lprofGetHostName missing. This is due to a bug inside llvm's compiler-rt. To circumvent this add the following lines of code to one of your files:

#ifdef __clang__
#if _WIN32 && __clang_major__ == 8 && __clang_minor__ == 0 &&                  \
    __clang_patchlevel__ == 0

#include <windows.h>

extern "C" int lprofGetHostName(char *Name, int Len) {
    WCHAR Buffer[128];
    DWORD BufferSize = sizeof(Buffer);
    BOOL Result =
        GetComputerNameExW(ComputerNameDnsFullyQualified, Buffer, &BufferSize);
    if (!Result)
        return -1;
    if (WideCharToMultiByte(CP_UTF8, 0, Buffer, -1, Name, Len, nullptr,
                            nullptr) == 0)
        return -1;
    return 0;
}

#endif
#endif

I recommend putting it into the main file of your testing framework eg.

Running

Similar to how sanitizers work in CLion, coverage is automatically gathered when the right compiler flags are detected. After your executable has terminated a modal dialog will open telling you that coverage is being gathered and prohibiting you from editing the source code. As soon as it finishes the tool window on the right will open and display your statistics. You can double click either on a file or a function to navigate to said symbol or you can click on the header above to sort by a metric. By default only source files inside of your project will be displayed. By checking the checkbox on the top right every file compiled into your project will be shown. Using the clear button will clear all editors and the tool window.

Differences in compilers

This plugin implements 3 different coverage gathers. Clang 5 onwards, GCC 9 onwards and GCC 6 to 8. GCC 6 to 8 is not recommended and cannot produce branch coverage like the other two. The most powerful of these implementations is Clang.

Clang doesn't use line coverage but instead uses region coverage and has no branch coverage on its own. A region is a block of code that has the same execution count and is specified from start to end character. This precise data allows this plugin to generate branch coverage for Clang via postprocessing by making a query into the CLion parser structure and comparing the execution counts of neighbouring regions. Region coverage also allows checking if operands of boolean operators that short circuit have been evaluated or not.

GCC 9 and onwards on the other hand produces line and branch coverage. The problem with this approach is that the data is less precise and has major problems when there are multiple statements on a single line. Branch coverage is also given per line and the plugin needs to make a query into the line to match up the branches specified by gcov to the statements in the source code. Another issue is that GCC generates a branch for every expression that may throw an exception. As 99% of all expressions that could throw an exception never do and showing such branches would generate incredible amount of noise in the editor the plugin filters them out.

Previous versions of gcc generated very similar information as GCC 9. Branch coverage however does not carry information as to where a branch comes from and as all newer versions of gcc implement the GCC 9 format or newer, I decided not to try and implement branch coverage for GCC 6 to 8. Line coverage however should work as intended. Please note that gcov versions 6 to 8 crash easily on large projects.

Known Issues/TODOs

  • Due to the plugin needing the parser structure of source files coverage gathering is paused and later resumed if indexing is in progress
  • This plugin is untested on Mac OS-X. It should work as long as the toolchains are setup correctly. One thing to watch out for is that gcc, g++ and gcov installed by XCode are NOT GCC but actually clang,clang++ and a gcov like implementation by the LLVM project. This version of gcov will NOT WORK as it does not implement the same command line arguments as real gcov. Please install another toolchain or find a llvm-cov version suitable for your version of clang.
  • Currently a new function is generated for each type in a template instantiations. if constexpr also has weird data and in general data in such functions may be less accurate. Future versions will try to address this issue and possibly even parse the function name in order to collapse different instantiations of the same function
  • Remote Machine is currently in WIP and requires some restructuring of the Architecture. WSL is supported

c-cpp-coverage-for-clion's People

Contributors

rcoscali avatar zero9178 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

Forkers

bennybbb rcoscali

c-cpp-coverage-for-clion's Issues

gcov called with -b arg even though branch coverage is disabled

Since version 2.0.0 we have the problem, that it always tries to evaluate the coverage data ( I personally liked the extra cover button ) and it always calls gcov with -b argument which causes gcov to crash.
Disabling all "Enable Branch ..." settings does not change anything.

Tried with GCC 8.1 and 6.3.

net.zero9178.cov.data.LLVMCoverageGenerator: lass java.lang.Integer cannot be cast to class java.lang.Boolean

  • CLion 2019.2.2
  • Plugin version 2.0.2
  • macOS mojave
  • valgrind from homebrew: https://github.com/LouisBrunner/valgrind-macos
  • llvm-cov: /Library/Developer/CommandLineTools/usr/bin/llvm-cov
  • llvm-profdata: /Library/Developer/CommandLineTools/usr/bin/llvm-cov
java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Boolean (java.lang.Integer and java.lang.Boolean are in module java.base of loader 'bootstrap')
	at net.zero9178.cov.data.LLVMCoverageGenerator$processJson$root$1.fromJson(LLVMCoverageGenerator.kt:107)
	at com.beust.klaxon.DefaultConverter.fromCollection(DefaultConverter.kt:130)
	at com.beust.klaxon.DefaultConverter.fromJson(DefaultConverter.kt:30)
	at com.beust.klaxon.JsonObjectConverter.retrieveKeyValues(JsonObjectConverter.kt:185)
	at com.beust.klaxon.JsonObjectConverter.initIntoUserClass(JsonObjectConverter.kt:67)
	at com.beust.klaxon.JsonObjectConverter.fromJson(JsonObjectConverter.kt:32)
	at com.beust.klaxon.DefaultConverter.fromJsonObject(DefaultConverter.kt:208)
	at com.beust.klaxon.DefaultConverter.fromJson(DefaultConverter.kt:31)
	at com.beust.klaxon.DefaultConverter.fromCollection(DefaultConverter.kt:130)
	at com.beust.klaxon.DefaultConverter.fromJson(DefaultConverter.kt:30)
	at com.beust.klaxon.JsonObjectConverter.retrieveKeyValues(JsonObjectConverter.kt:185)
	at com.beust.klaxon.JsonObjectConverter.initIntoUserClass(JsonObjectConverter.kt:67)
	at com.beust.klaxon.JsonObjectConverter.fromJson(JsonObjectConverter.kt:32)
	at com.beust.klaxon.DefaultConverter.fromJsonObject(DefaultConverter.kt:208)
	at com.beust.klaxon.DefaultConverter.fromJson(DefaultConverter.kt:31)
	at com.beust.klaxon.DefaultConverter.fromCollection(DefaultConverter.kt:130)
	at com.beust.klaxon.DefaultConverter.fromJson(DefaultConverter.kt:30)
	at com.beust.klaxon.JsonObjectConverter.retrieveKeyValues(JsonObjectConverter.kt:185)
	at com.beust.klaxon.JsonObjectConverter.initIntoUserClass(JsonObjectConverter.kt:67)
	at com.beust.klaxon.JsonObjectConverter.fromJson(JsonObjectConverter.kt:32)
	at com.beust.klaxon.DefaultConverter.fromJsonObject(DefaultConverter.kt:208)
	at com.beust.klaxon.DefaultConverter.fromJson(DefaultConverter.kt:31)
	at com.beust.klaxon.Klaxon.fromJsonObject(Klaxon.kt:296)
	at net.zero9178.cov.data.LLVMCoverageGenerator.processJson(LLVMCoverageGenerator.kt:378)
	at net.zero9178.cov.data.LLVMCoverageGenerator.generateCoverage(LLVMCoverageGenerator.kt:374)
	at net.zero9178.cov.CoverageConfigurationExtension$attachToProcess$1$processTerminated$1.run(CoverageConfigurationExtension.kt:111)
	at com.intellij.openapi.progress.impl.CoreProgressManager$TaskRunnable.run(CoreProgressManager.java:894)
	at com.intellij.openapi.progress.impl.CoreProgressManager$5.run(CoreProgressManager.java:447)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:169)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:591)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:537)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:59)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:156)
	at com.intellij.openapi.application.impl.ApplicationImpl.lambda$null$9(ApplicationImpl.java:552)
	at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:294)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)

WSL support?

With the latest updates, I appear to have lost the ability to use the gcov on WSL. The "C/C++ Coverage" configuration will not accept a WSL path, only a windows path.

Questions about usage, as a novice user

Hi, I'm going to be doing a demo early next week, showing coverage in CLion... And I'm hoping to show this plugin's branch coverage...

So I really want to check my understanding of it. And I figured that others may find the answers useful too, so I hope it's OK if I create an issue to ask for info....

Background:

  • I'm running the plugin in CLion 2020.3 - on macOS
  • Compiler is:
clang version 11.0.0 (https://github.com/llvm/llvm-project.git 176249bd6732a8044d457092ed932768724a6f06)
Target: x86_64-apple-darwin19.6.0
Thread model: posix
InstalledDir: /Users/clare/Documents/develop/tools/clang/clang+llvm-11.0.0-x86_64-apple-darwin/bin
  • My CLion run-profile was set up by clicking CLion's Coverage button, and then allowing CLion to create a new configuration, with adjusted configuration, to enable coverage. This added these CMake args:
    -DCMAKE_CXX_FLAGS="-fprofile-instr-generate -fcoverage-mapping" -DCMAKE_C_FLAGS="-fprofile-instr-generate -fcoverage-mapping". This is really handy, as it saves me having to work out what options to add - CLion just takes care of it.

Questions

  1. As far as I can tell, this plugin only updates its results display when I use CLion's Run button - and not when I do Debug or Coverage. Is that correct? (It makes it a big complicated to explain how to set up - as I think I have to say "Click to Coverage button to get CLion to set up the build config - but after that, use the Run button, to get branch coverage)
  2. I'm happy that I've collected enough coverage data now, and I want to go back to developing, with the normal CLion display. I've used Run -> "Hide Coverage" to hide CLion's coverage display. My screen looks like the following - how can I turn off this plugin's display of background colour and icons, without disabling the plugin and restarting CLion?

image

No coverage data found despite the cmake folder is full of `gcov` files

compiled and built my test project like following

TARGET_COMPILE_OPTIONS(etcdTest PUBLIC
                       **--coverage**)
TARGET_INCLUDE_DIRECTORIES(etcdTest PRIVATE
                           ${GRPC_INCLUDE_DIR}
                           ${PROTOBUF_INCLUDE_DIR}
                           ${ETCDIncludePath}
                           )

TARGET_LINK_LIBRARIES(etcdTest
                      ${PROTOBUF_LIBRARY}
                      gRPC::grpc
                      gRPC::grpc++
                      pthread
                      dl
                      **gcov**
                      )

Got the "No coverage data found. Did you compile with "--coverage"?"
The cmake-build-debug/CMakeFiles/ folder is full of gcov files.
Am I doing something wrong?

Function names not demangled - how do I fix my settings?

Many thanks for the new version in #24 (comment). I was able to install it the current (non-EAP) release - which is what I'm using for the demo.

I am planning to release this version, among other subtle fixes and Clang 12 integration on Monday.
I have attached the current binary if you want to test it out yourself meanwhile.

C C++ Coverage-2020.3.1.zip

You mentioned the name demangler above, which prompted me to look a bit more closely at the results... And to see that I could see results broken down by function, which is great!

Also, that on my Mac, names are not demangled...

image

My settings are:

image

The demangler is present:

ls -ls /Users/clare/Documents/develop/tools/clang/clang+llvm-11.0.0-x86_64-apple-darwin/bin/llvm-cxxfilt
824 -rwxr-xr-x  1 clare  staff  421408 12 Oct 18:41 /Users/clare/Documents/develop/tools/clang/clang+llvm-11.0.0-x86_64-apple-darwin/bin/llvm-cxxfilt

and the profile is unchanged from when CLion set it up for me yesterday:

image

java.lang.NumberFormatException: For input string: ""

Upgraded to CLion 2018.3.2 and using the latest 1.1.2 release of GCoverage4CLion:

java.lang.NumberFormatException: For input string: ""
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:592)
	at java.lang.Integer.parseInt(Integer.java:615)
	at gcov.state.GCovSettings.setVersion(GCovSettings.kt:94)
	at gcov.state.GCovSettings.setGcovPath(GCovSettings.kt:18)
	at gcov.state.GCovSettings.handleEmptyPath(GCovSettings.kt:61)
	at gcov.state.GCovSettings.<init>(GCovSettings.kt:23)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.picocontainer.defaults.InstantiatingComponentAdapter.newInstance(InstantiatingComponentAdapter.java:193)
	at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.doGetComponentInstance(CachingConstructorInjectionComponentAdapter.java:85)
	at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.instantiateGuarded(CachingConstructorInjectionComponentAdapter.java:62)
	at com.intellij.util.pico.CachingConstructorInjectionComponentAdapter.getComponentInstance(CachingConstructorInjectionComponentAdapter.java:45)
	at com.intellij.openapi.components.impl.ServiceManagerImpl$MyComponentAdapter.getComponentInstance(ServiceManagerImpl.java:210)
	at com.intellij.util.pico.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:246)
	at com.intellij.util.pico.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:213)
	at com.intellij.openapi.components.ServiceManager.doGetService(ServiceManager.java:52)
	at com.intellij.openapi.components.ServiceManager.getService(ServiceManager.java:30)
	at gcov.state.GCovSettings$Companion.getInstance(GCovSettings.kt:99)
	at gcov.data.CoverageThread.generateGCDA(CoverageThread.kt:34)
	at gcov.data.CoverageThread.run(CoverageThread.kt:152)

Remote Host Support

Hi,
is it supported to use gcov on a remote host? Right now it's trying to use my local Mac gcov version, which leads to the following error:
17:32 gcov returned error code 127 (Invocation and error output:): Invocation: /usr/local/bin/gcov -i -m -t -b /tmp/path/to/remote/host (show balloon)

Since WSL is supported, this might be possible too?
Thanks in advance for any help!

Crash when runnig gcov

Crash happens with 2.0.2

gcov returned error code -1073741819 (Invocation and error output:): Invocation: C:\MinGW\bin\gcov.exe -i -m -b C:\git\XXXXXXXX\build\debug-gcc\external\googletest\googlemock\CMakeFiles\gmock.dir\src\gmock-all.cc.gcda C:\git\XXXXXXXX\build\debug-gcc\external\googletest\googlemock\gtest\CMakeFiles\gtest.dir\src\gtest-all.cc.gcda ....

Same setup worked with 1.1.3
gcov (MinGW.org GCC-6.3.0-1) 6.3.0

NumberFormatException: For input string: "5399167664"

Hello,

I get the following exception in CLion in 2019.1.2 with gcc / gcov version 8.

I installed gcc 8 via brew install gcc and pointed the coverate gcov to /usr/local/bin/gcov-8. Then I set the following environment variables to use GCC and enable coverage: CXXFLAGS=--coverage;LDFLAGS=--coverage;CFLAGS=--coverage;CC=gcc-8;CXX=g++-8.

When I do c coverage run I get the following exception:

java.lang.NumberFormatException: For input string: "5399167664"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:583)
	at java.lang.Integer.parseInt(Integer.java:615)
	at gcov.data.CoverageThread.parseGCov(CoverageThread.kt:146)
	at gcov.data.CoverageThread.run(CoverageThread.kt:191)

Thanks,
Gregor

Viewing coverage for library targets

Is there anyway to view the coverage for library targets?

My target is a shared library that is called from a Python script. I want to run the Python script and see the resulting coverage of the C library being called.

Is that an option? How can I do something like that?

[1.1.3] String index out of range: -1

Hi, I got following exception report:

java.lang.StringIndexOutOfBoundsException: String index out of range: -1
	at java.lang.String.substring(String.java:1967)
	at gcov.data.CoverageThread.parseGCov(CoverageThread.kt:97)
	at gcov.data.CoverageThread.run(CoverageThread.kt:191)

Running into exception when defining llvm-cov path

When defining the llvm-cov path for Clang toolchains, I'm running into following exception when applying my changes.

clang version: 8.0.0
clion version: 2019.2.5

This is my first time using the plugin with Clang -- I should be providing the llvm-cov path associated with my clang/llvm build, correct? The UI specifies a gcov path -- so the tool might be expecting that all paths are gcov paths etc.

java.util.NoSuchElementException: Sequence is empty.
	at kotlin.sequences.SequencesKt___SequencesKt.first(_Sequences.kt:107)
	at gcov.state.GCovSettings$GCov.setVersion(GCovSettings.kt:92)
	at gcov.state.GCovSettings$GCov.setGcovPath(GCovSettings.kt:28)
	at gcov.state.GCovSettings.putGCovPathForToolchain(GCovSettings.kt:110)
	at gcov.window.GCovSettingsWindow.apply(GCovSettingsWindow.java:82)
	at com.intellij.openapi.options.ex.ConfigurableWrapper.apply(ConfigurableWrapper.java:165)
	at com.intellij.openapi.options.newEditor.ConfigurableEditor.apply(ConfigurableEditor.java:318)
	at com.intellij.openapi.options.newEditor.SettingsEditor$5.apply(SettingsEditor.java:173)
	at com.intellij.openapi.options.newEditor.ConfigurableEditor$2.actionPerformed(ConfigurableEditor.java:64)
	at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
	at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
	at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
	at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
	at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:270)
	at java.desktop/java.awt.Component.processMouseEvent(Component.java:6651)
	at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
	at java.desktop/java.awt.Component.processEvent(Component.java:6416)
	at java.desktop/java.awt.Container.processEvent(Container.java:2263)
	at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5026)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
	at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
	at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
	at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
	at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:878)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:823)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:466)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:693)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:465)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:117)
	at java.desktop/java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:190)
	at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:235)
	at java.desktop/java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:233)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.desktop/java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:233)
	at java.desktop/java.awt.Dialog.show(Dialog.java:1063)
	at com.intellij.openapi.ui.impl.DialogWrapperPeerImpl$MyDialog.show(DialogWrapperPeerImpl.java:707)
	at com.intellij.openapi.ui.impl.DialogWrapperPeerImpl.show(DialogWrapperPeerImpl.java:432)
	at com.intellij.openapi.ui.DialogWrapper.doShow(DialogWrapper.java:1685)
	at com.intellij.openapi.ui.DialogWrapper.show(DialogWrapper.java:1644)
	at com.intellij.openapi.options.newEditor.SettingsDialog.lambda$show$0(SettingsDialog.java:77)
	at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:82)
	at com.intellij.openapi.application.TransactionGuardImpl.submitTransactionAndWait(TransactionGuardImpl.java:148)
	at com.intellij.openapi.options.newEditor.SettingsDialog.show(SettingsDialog.java:77)
	at com.intellij.ide.actions.ShowSettingsUtilImpl.showSettingsDialog(ShowSettingsUtilImpl.java:84)
	at com.intellij.ide.actions.ShowSettingsAction.perform(ShowSettingsAction.java:54)
	at com.intellij.ide.actions.ShowSettingsAction.actionPerformed(ShowSettingsAction.java:41)
	at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:265)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:282)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$actionPerformed$0(ActionMenuItem.java:292)
	at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:265)
	at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:107)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:282)
	at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$0(ActionMenuItem.java:111)
	at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:82)
	at com.intellij.openapi.application.TransactionGuardImpl.lambda$submitTransaction$1(TransactionGuardImpl.java:106)
	at com.intellij.openapi.application.TransactionGuardImpl.submitTransaction(TransactionGuardImpl.java:115)
	at com.intellij.openapi.application.TransactionGuard.submitTransaction(TransactionGuard.java:121)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:111)
	at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:524)
	at com.intellij.ui.plaf.beg.BegMenuItemUI.access$300(BegMenuItemUI.java:35)
	at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:546)
	at java.desktop/java.awt.Component.processMouseEvent(Component.java:6651)
	at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
	at java.desktop/java.awt.Component.processEvent(Component.java:6416)
	at java.desktop/java.awt.Container.processEvent(Container.java:2263)
	at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5026)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
	at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
	at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
	at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
	at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:878)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:823)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:466)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:704)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:465)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

0% files, 0% lines covered.

I have made all the necessary settings but I don't get any statistics. For every file that has test, it just shows as "0% files, 0% lines covered". I'm running clion on Mac Mojave, clion version: 2019.3.6

Exception: Window with id GCoverage isn't registered

When running the Coverage I get the following CLion exception:

java.lang.Throwable: window with id="GCoverage" isn't registered

The following warnings are shown in the Event Log:

  • stamp mismatch with notes file
  • source file is newer than notes file

Coverage results are shown correct in the editor but the GCoverage window is not opened.
I also can't open the window manually over View->ToolWindows->GCoverage, the option is greyed out.

CLion: CLion 2019.1 EAP, Build #CL-191.6014.11
GCoverage: v1.1.3

Stacktrace:

 java.lang.Throwable: window with id="GCoverage" isn't registered
	at com.intellij.openapi.diagnostic.Logger.error(Logger.java:145)
	at com.intellij.openapi.wm.impl.ToolWindowManagerImpl.getRegisteredInfoOrLogError(ToolWindowManagerImpl.java:681)
	at com.intellij.openapi.wm.impl.ToolWindowManagerImpl.showToolWindowImpl(ToolWindowManagerImpl.java:886)
	at com.intellij.openapi.wm.impl.ToolWindowManagerImpl.showToolWindow(ToolWindowManagerImpl.java:793)
	at com.intellij.openapi.wm.impl.ToolWindowImpl.show(ToolWindowImpl.java:187)
	at gcov.window.GCovWindowFactory.lambda$null$0(GCovWindowFactory.java:62)
	at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:315)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.doRun(LaterInvocator.java:435)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.runNextEvent(LaterInvocator.java:419)
	at com.intellij.openapi.application.impl.LaterInvocator$FlushQueue.run(LaterInvocator.java:403)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:764)
	at java.awt.EventQueue.access$500(EventQueue.java:98)
	at java.awt.EventQueue$3.run(EventQueue.java:715)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:734)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:723)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:672)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:367)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Documentation seems incorrect for clang 9

Documentation suggest using flags -fprofile-instr-generate -fcoverage-mapping for clang
compiler, but this raises the following error with clang 9 on macOs:

clang-9: error: unknown argument: '-fprofile-instr-generate -fcoverage-mapping'

Unknown command line argument

Whenever I try to exeucte the coverage I get the following errror message:

gcov returned following warning:
gcov: Unknown command line argument '-i'. Try: '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gcov -help'
Did you mean '-a'?
gcov: Unknown command line argument '-m'. Try: '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gcov -help'
Did you mean '-a'?

I am using CLion 2018.3.3 with Mojave 10.14 and gcov: Apple LLVM version 10.0.0 (clang-1000.11.45.5)

Maybe provide feedback if no results after clicking Plugin's action

If I accidentally all click on the Plugin's "Run Coverage" button in a profile/config that is not setup for coverage measurement, I don't get any feedback.

Right now, my process is to:

  1. Click on the Clion "Run with Coverage" button, and have it create a new config with coverage enabled.
  2. Switch to running this plugin's coverage button instead....

I'm not sure what to suggest as a better action...

Maybe at least, if someone explicitly clicked on your Coverage button and no coverage is found, could you pop up a message saying "click here for help with enabling coverage" - and take users to your README...

Then we can work on its wording, over time - to help those new to coverage to set up their environment.

The plugin does not work with some light CLion themes

For the dark theme, I see this:
image

But for light themes ('Windows 10 Light' or 'Light Flat Theme') I get this:
image

Does the plugin have any settings for code highlighting colors? How can I change them?

I use 'C/C++ Coverage 2022.1.0-Eap' and 'CLion 2022.1'

Exception in CLion

Hi,

I'm getting an exception when trying to use this plugin.

com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'warning': was expecting ('true', 'false' or 'null') at [Source: (StringReader); line: 1, column: 8] at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1804) at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:679) at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken(ReaderBasedJsonParser.java:2835) at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(ReaderBasedJsonParser.java:1889) at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:747) at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:4141) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4000) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3049) at com.beust.klaxon.jackson.JacksonParser.parse(JacksonParser.kt:39) at net.zero9178.cov.data.LLVMCoverageGenerator.processJson(LLVMCoverageGenerator.kt:138) at net.zero9178.cov.data.LLVMCoverageGenerator.generateCoverage(LLVMCoverageGenerator.kt:390) at net.zero9178.cov.CoverageConfigurationExtension$attachToProcess$1$processTerminated$1.run(CoverageConfigurationExtension.kt:111) at com.intellij.openapi.progress.impl.CoreProgressManager$TaskRunnable.run(CoreProgressManager.java:894) at com.intellij.openapi.progress.impl.CoreProgressManager$5.run(CoreProgressManager.java:447) at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:169) at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:591) at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:537) at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:59) at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:156) at com.intellij.openapi.application.impl.ApplicationImpl.lambda$null$9(ApplicationImpl.java:552) at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:294) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:834)

Exception in CLion

I've been getting some errors from CLion that say they are in this plugin.

I'm running 2020.2... But the exceptions say:

Exception in plugin CC++ Coverage (2020.3.0 EAP).

java.lang.AssertionError: 98; this: 10
	at com.intellij.openapi.editor.impl.IntervalTreeImpl.checkBelongsToTheTree(IntervalTreeImpl.java:928)
	at com.intellij.openapi.editor.impl.IntervalTreeImpl.removeInterval(IntervalTreeImpl.java:960)
	at com.intellij.openapi.editor.impl.MarkupModelImpl.removeHighlighter(MarkupModelImpl.java:228)
	at net.zero9178.cov.editor.CoverageHighlighter$$special$$inlined$invokeLater$1.run(actions.kt:61)
	at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:216)
	at com.intellij.openapi.application.TransactionGuardImpl.access$200(TransactionGuardImpl.java:24)
	at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:199)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:822)
	at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLater$4(ApplicationImpl.java:324)
	at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:85)
	at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:134)
	at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:47)
	at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:190)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:976)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:843)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:454)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:773)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:453)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:822)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:501)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

I got 7 over the last 10 minutes or so... they all differ only in the first lines, which are:

java.lang.AssertionError: 98; this: 10
java.lang.AssertionError: 101; this: 20
java.lang.AssertionError: 104; this: 30
java.lang.AssertionError: 107; this: 46
java.lang.AssertionError: 110; this: 62
java.lang.AssertionError: 113; this: 72
java.lang.AssertionError: 116; this: 82

No llvm-profdata specified to accompany llvm-cov on macOS

I'm getting this error on macOS 10.14.5 with Apple Clang:

Coverage could not be generated due to following error:
 No llvm-profdata specified to accompany llvm-cov

However, both lvm-profdata and llvm-cov are in my PATH, and I'm able to generate coverage manually in terminal.

Can you please point me to a solution here?

[2.11] Exception with Clang(8/9)

Getting the current exception at the time of coverage report generation on clang 8 and 9.

java.lang.IndexOutOfBoundsException: fromIndex (-1) is less than zero.
	at kotlin.collections.CollectionsKt__CollectionsKt.rangeCheck$CollectionsKt__CollectionsKt(Collections.kt:371)
	at kotlin.collections.CollectionsKt__CollectionsKt.binarySearch(Collections.kt:344)
	at net.zero9178.cov.data.LLVMCoverageGenerator$processJson$$inlined$flatMap$lambda$1.call(LLVMCoverageGenerator.kt:556)
	at net.zero9178.cov.data.LLVMCoverageGenerator$processJson$$inlined$flatMap$lambda$1.call(LLVMCoverageGenerator.kt:33)
	at com.intellij.openapi.application.impl.ApplicationImpl$2.call(ApplicationImpl.java:322)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)

Induced Exception:

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.collections.CollectionsKt__MutableCollectionsKt.addAll, parameter elements
	at kotlin.collections.CollectionsKt__MutableCollectionsKt.addAll(MutableCollections.kt)
	at net.zero9178.cov.data.LLVMCoverageGenerator.processJson(LLVMCoverageGenerator.kt:610)
	at net.zero9178.cov.data.LLVMCoverageGenerator.generateCoverage(LLVMCoverageGenerator.kt:534)
	at net.zero9178.cov.CoverageConfigurationExtension$attachToProcess$1$processTerminated$1.run(CoverageConfigurationExtension.kt:111)
	at com.intellij.openapi.progress.impl.CoreProgressManager$TaskRunnable.run(CoreProgressManager.java:894)
	at com.intellij.openapi.progress.impl.CoreProgressManager$5.run(CoreProgressManager.java:447)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:169)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:591)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:537)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:59)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:156)
	at com.intellij.openapi.application.impl.ApplicationImpl.lambda$null$9(ApplicationImpl.java:552)
	at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:294)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.